현재 경로에 있는 모든 파일/실행 가능한 바이너리를 나열하기 위해 "ls -la" 스타일 명령을 실행하는 "쉬운" 방법이 있습니까?
(알 수 없는 접두사가 있지만 본질적으로 알려진 "이름"이 있는 명령을 찾기 위해 출력을 grep으로 파이핑할 계획입니다. 이 경우 bash의 자동 완성/탭은 기본적으로 쓸모가 없습니다. 그래서 일종의 "역자동" 완성 기능입니다." .)
답변1
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.
답변2
이것은 디렉토리의 내용을 나열하는 기능입니다 $PATH
. 인수가 전달되면 함수는 이름에 인수 중 하나가 포함된 명령만 나열합니다. 매개변수는 전역 패턴으로 해석됩니다.
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
}
^
문자매개변수 확장배열과 연결된 텍스트가 path=(/bin /usr/bin); echo $^path/foo
prints 와 같은 각 배열 요소에 추가되도록 합니다 /bin/foo /usr/bin/foo
.
/*$^@*
희극적인 모욕처럼 보이지만 실제로는 일반 문자 /
, 와일드카드 *
, 수정자가 있는 특수 매개변수 $@
(위치 매개변수 배열) 등입니다 ^
. ~이다*
(N:t)
글로벌 예선 N
일치하는 항목이 없으면 빈 확장명을 얻습니다.기록 수정자 t
각 게임의 기본 이름("tail")만 유지됩니다.
더 이상하게도 외부 전화를 피하는 것은 피상적인 관심일 뿐입니다.
lspath () {
(($#)) || set ''
local names; names=($^path/*$^@*(N:t))
print -lr -- ${(ou)names}
}
사실, 당신이 찾고 있을 수도 있습니다apropos
키워드가 포함된 명령에 대한 간단한 설명을 매뉴얼 페이지에서 검색하는 명령입니다. 한 가지 제한 사항은 매뉴얼 페이지가 있는 명령만 찾을 수 있다는 것입니다.
답변3
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$'
답변4
for i in $(echo $PATH | sed -e 's/\:/\ /g'); do find "$i" -perm +rwx -exec echo {} \; 2> /dev/null; done
먼저 sed에 echo $PATH
하고 ":"를 ""로 바꿉니다.
그런 다음 rwx가 있는 파일을 찾고 에코하기 위해 각 항목을 조회합니다.
2> /dev/null
이렇게 하면 find
인쇄 오류가 발생하지 않습니다.