특정 문자로 시작하는 명령에 대한 PATH 검색

특정 문자로 시작하는 명령에 대한 PATH 검색

문자로 시작하는 모든 명령을 나열하려면 어떤 명령을 사용할 수 있습니까 g? bash완성 기능을 사용할 수 없어서 스크립트를 작성해야 한다고 가정해 보겠습니다 .

답변1

기본적으로 나열된 모든 디렉토리를 반복 PATH하고 a를 실행하여 find패턴을 검색해야 합니다. 이 경우 문자로 시작하는 바이너리입니다.'G'. 빨리 달려:

for i in $(echo $PATH | tr ":" "\n")
do
  find ${i} -iname "g*" 2> /dev/null
done

일부 디렉토리에는 정규식과 일치하는 파일이 없을 수 있으므로 2> /dev/null.

이 접근 방식은 정적 또는 동적 라이브러리 검색과 같은 다른 많은 상황에 유용합니다.

답변2

거기간단한 명령을 사용하여 이 작업을 수행할 수 있지만 "완료 사용 안 함" bash요구 사항을 위반할 수 있습니다. bash그럼에도 불구하고 나는 이 답변의 끝에 그것을 포함하고 있습니다. 대신 이 문제를 해결하기 위해 몇 가지 루프를 사용하겠습니다.

g아래 나열된 디렉토리 중 해당 문자로 시작하는 실행 가능한 외부 명령을 모두 찾고 싶다고 가정해 보겠습니다 $PATH.

#!/bin/sh

IFS=:; set -f; set -- $PATH; set +f
for dirpath do
    for pathname in "$dirpath"/g*; do
        if [ -x "$pathname" ]; then
            printf 'Executable: %s (%s)\n' "${pathname##*/}" "$pathname"
        fi
    done
done

이것은 먼저 위치 인수를 변수에 보관된 디렉토리 목록으로 설정합니다 PATH. IFS로 설정하여 이를 수행 합니다 :. 즉, 따옴표 없이 사용하면 해당 값이 문자열의 문자 단위로 분할됩니다 $PATH. :따옴표가 없는 변수를 안전하게 사용하기 위해 set -f문자열의 일부가 파일 이름 와일드카드 패턴으로 해석될 수 있는 경우 와일드카드를 일시적으로 해제합니다. set +f나중에 필요하므로 와일드카드를 다시 활성화합니다 .

위치 매개변수를 디렉토리 경로 목록으로 설정한 후에는 매개변수를 반복합니다. 각 반복에서 해당 문자로 시작하는 해당 디렉토리에 있는 모든 파일의 경로 이름을 얻고 g각 파일을 테스트하여 1) 존재하는지, 2) 실행 가능한지 확인합니다(테스트는 -x이 두 가지 작업을 수행합니다). 실행 가능한 경우 해당 이름과 전체 경로 이름을 출력합니다.

이것은 현재 상황만을 다루도록 질문을 제한한다는 점에 유의하십시오 $PATH. 별칭이나 쉘 기능은 찾을 수 없습니다. 내장 유틸리티로만 제공되는 유틸리티도 고려되지 않습니다.

${variable//pattern/word}변수 값의 어디에서나 패턴을 문자열로 바꾸는 것을 find이해 하는 쉘을 사용하고 -maxdepth( -executable그 점에 대해 찬사를 보냅니다)이삭이 접근 방식은 다른 곳에서 언급됩니다.)

(
    set -f
    find -H -- ${PATH//:/ } -maxdepth 1 -type f -name 'g*' -executable
)

find그러면 명령에 대한 와일드카드 기능 이 꺼진 다음 나열된 각 디렉터리 에서 실행 파일에 해당하는 이름 $PATH으로 시작하는 이름을 검색합니다. g현재 사용자만 실행할 수 있음을 알 수 있습니다. -perm -o+x대신 -executable실행 가능 비트가 "기타"로 설정되어 있는지 테스트하는 데 사용하십시오 .

-H이 옵션은 find명령줄(예: 검색 경로)에 제공된 심볼릭 링크를 확인하지만 경로를 탐색할 때 발견된 심볼릭 링크는 확인하지 않습니다.


위의 내용은 일반적인 /bin/sh해결책입니다. 특수 명령이 허용되는 경우 문자로 시작하는 bash모든 외부 명령, 셸 기능 및 별칭 목록을 생성할 수 있습니다.g

compgen -c g

내장 명령을 포함하려면 다음을 사용하십시오.

compgen -bc g

...하지만 이는 " bash사용에 따른 완료"로 간주될 수 있습니다.

compgen내장 명령은 설명서에 설명되어 있습니다 bash(1).

관련 정보