답변:
compgen -c # will list all the commands you could run.
compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.
which $(compgen -A function -abck)
있습니까?
다음은 디렉토리의 내용을 나열하는 함수입니다 $PATH
. 인수가 전달되면 함수는 이름이 인수 중 하나를 포함하는 명령 만 나열합니다. 인수는 glob 패턴으로 해석됩니다.
shopt -s extglob
lspath () {
local IFS pattern
IFS='|'
pattern="*@($*)*"
IFS=':'
for d in $PATH; do
for x in "$d/"$pattern; do
[ "$x" = "$d/$pattern" ] || echo "${x##*/}"
done
done | sort -u
}
많은 것들과 마찬가지로, 이것은 zsh에서 더 쉽습니다.
lspath () {
(($#)) || set ''
print -lr -- $^path/*$^@*(N:t) | sort -u
}
매개 변수 확장 의 ^
문자 는 배열과 연결된 텍스트가 각 배열 요소에 추가되도록합니다 (예 : prints) . 만화책 모욕처럼 보이지만 실제로는 일반 문자 , 와일드 카드 , 특수 매개 변수 (위치 매개 변수 배열) 및 수정자를 사용합니다 . 는 IS 글로브 규정 에 의해 다음에 일치하는 항목이없는 경우 빈 확장을 얻기 위해 역사 수정 각 경기의 기본 이름 ( "꼬리")를 유지합니다.path=(/bin /usr/bin); echo $^path/foo
/bin/foo /usr/bin/foo
/*$^@*
/
*
$@
^
*
(N:t)
N
t
더 비밀스럽고 외부 전화를 피하지만 이것은 단지 관심의 대상입니다.
lspath () {
(($#)) || set ''
local names; names=($^path/*$^@*(N:t))
print -lr -- ${(ou)names}
}
실제로 apropos
명령을 찾고있을 수 있습니다. 이 명령은 간단한 설명에 키워드가 포함 된 명령의 맨 페이지를 검색합니다. 제한 사항은 man 페이지가있는 명령 만 찾을 수 있다는 것입니다.
^
는 "인수 없음"호출에 대한 출력이없는 것 같습니다. 삭제하면 모든 키워드를 나열하고 단일 키워드를 검색 할 수 있습니다 (단, 키워드 목록은 아님). 는 (Non:t)
별표가 확대되어야한다고 말하는 것 같다? 마지막으로 알아낼 수 없었습니다.
path
쉘에서 실행하면 실제로 $ PATH이지만 대신 공백이 :
있습니다. 나머지는 명백하다 :)
$path
zsh 기능입니다. 이는 묶인 매개 변수 이며, 업데이트 될 때 자동으로 업데이트되는 배열입니다 PATH
.
function findinpath () {
OLDIFS="$IFS" ;
IFS="$(printf ':\t\n')" ;
for regexp in "$@" ; do
for adir in $PATH ; do
find "$adir" -perm -111 -a ! -type d -ls 2>/dev/null | grep -i "/[^/]*$regexp"
done ;
done ;
IFS="$OLDIFS" ;
}
찾기는 다음과 일치합니다. "x"(실행 가능) 비트 세트가 하나 이상 있으며 디렉토리가 아닙니다.
정규식 목록과 함께 사용하십시오.
findinpath awk sed '\.sh$'
echo $PATH | tr ':' '\n' | sort | uniq -d
for i in $(echo $PATH | sed -e 's/\:/\ /g'); do find "$i" -perm +rwx -exec echo {} \; 2> /dev/null; done
먼저 $PATH
sed로 에코 하고 ":"을 ""로 바꿉니다.
그런 다음 rwx를 사용하여 파일을 찾아 에코하기 위해 각 항목을 찾습니다.
2> /dev/null
그렇게되는 find
오류가 인쇄되지 않습니다
-maxdepth 1
및 -type f
find에 필요하면 하위 디렉토리와 해당 파일 (PATH 검색이 수행하지 않는 파일)을 찾을 수 있습니다. 또한 귀하의 권한 테스트는 이상합니다 +x
.
:/bin
또는)를 처리하지 않습니다 /bin::/usr/bin
. 추가 시도 s/::/:.:/;s/^:/.:/;s/:$/:./
받는 sed
명령.
find
더 많은 경로를 검색 할 수 있으므로 루프없이 수행 할 수 있습니다. find $(echo $PATH | sed -e 's/\:/\ /g') -perm +rwx …
물론 공백을 포함하는 디렉토리 이름은 경로를 엉망으로 만들지 만 루프 기반 경로는 동일한 문제가 있습니다.
for
. 따라서 for
4 단어 목록을 반복합니다. 단어 분할을 더 잘 조작하려면 IFS
필요에 따라 다음을 설정하십시오 IFS=':'; find $PATH -perm +rwx …
.
ls -la
다릅니 까?