$PATH 폴더를 탐색하고 시스템에서 사용 가능한 실행 파일을 보기 위한 스크립트

$PATH 폴더를 탐색하고 시스템에서 사용 가능한 실행 파일을 보기 위한 스크립트

이것이 내가 지금까지 가지고 있는 것입니다:

#!/bin/bash

for file in $PATH ; do # Scanning files in $PATH

        if [ -x ] ; then #Check if executable
                echo "Executable File"
        else
                echo "Not executable"
        fi
done

출력은 "파일 실행 가능"입니다.

모든 폴더를 올바르게 반복하지 않는 것 같아요

답변1

원하는 것이 실행 파일 목록이라면 find이것으로 충분합니다.

IFS=':'
find $PATH -type f '(' -perm -u+x -o -perm -g+x -o -perm -o+x ')'

이것은 나열됩니다전체 경로해당 변수의 구분 기호인 $PATH콜론( )에서 분할 IFS=':'해야 합니다 .$PATH:

당신이 원하지 않는다면전체 경로, 그러나 단지실행 파일 이름, 당신은 할 수도 있습니다

IFS=':'
find $PATH -type f '(' -perm -u+x -o -perm -g+x -o -perm -o+x ')' -exec basename {} \; | sort

시스템이 findGNU와 호환된다면 조건은 훨씬 간단합니다.

IFS=':'
find $PATH -type f -executable -exec basename {} \; | sort

@StephenHarris가 지적했듯이 여기에는 몇 가지 문제가 있습니다. 하위 디렉터리가 존재하는 경우 $PATH해당 $PATH하위 디렉터리의 파일에 액세스할 수 없더라도 보고될 수 있습니다. 이 문제를 해결하려면 실제로필요POSIX에 필요한 것보다 더 많은 옵션이 있습니다 find. 이 문제에 대한 GNU 호환 솔루션은 다음과 같습니다.

IFS=':'
find $PATH -maxdepth 1 -type f -executable -exec basename {} \; | sort

이러한 하위 디렉터리에 들어가지 -maxdepth 1않도록 지시합니다 .find

답변2

한편으로는 $PATH디렉토리 목록이 제공됩니다. 의 모든 파일을 확인하려면 의 $PATH모든 항목을 확인하는 것이 아니라 모든 디렉터리의 모든 파일을 확인해야 합니다 $PATH.

다음으로 파일이 실행 가능한지 확인하는 데 사용 -x하지만 확인할 파일을 지정하지 않았습니다. 다음과 같이 수정된 버전을 작성했습니다.

IFS=':'
for directory in $PATH; do
    for file in $directory/*; do
        if [ -x $file ]; then
            echo "Executable File: " $file
        else
            echo "Not executable: " $file
        fi
    done
done

Fox의 답변이 더 나은 솔루션이지만 귀하가 귀하의 질문에 관심이 있을 것이라고 생각했습니다.

답변3

compgen특히 bash의 경우 내장된 기능을 활용할 수 있습니다 .

  • compgen -cTab사용 가능한 모든 명령, 내장 기능, 함수, 별칭 등을 나열합니다(기본적으로 빈 프롬프트에서 누를 때 표시될 수 있는 모든 것).
  • compgen -b모든 내장 함수, 유사한 d디렉터리, f파일, a별칭 등을 나열합니다.

compgen따라서 다음의 출력을 사용하고 남용할 수 있습니다 which.

$ compgen -c | xargs which -a
/bin/egrep
/bin/fgrep
/bin/grep
/bin/ls
/bin/ping
/usr/bin/time
/usr/bin/[
/bin/echo
/bin/false
/bin/kill

compgen내 경우 처음 5개는 실제로 별칭 마스킹 명령이고 그 다음에는 키워드와 내장 명령이 있으므로 출력에 순서가 있는 것 같습니다.

답변4

IFS=:; set -f;
find -- $PATH -type d -prune -exec sh -c '
cd "$1" && \
find . -type d ! -name . -prune \
           -o \
-type f \( -perm -u+x -o -perm -g+x -o -perm -o+x \) -exec echo Executable File: \{\} \; \
           -o \
-type f  ! -perm -u+x  ! -perm -g+x  ! -perm -o+x    -exec echo Not executable: \{\} \;
' {} {} \;

IFS는 콜론으로 설정되며, PATH 구분 기호 및 glob 일치도 비활성화되어 PATH에 있는 이름의 glob 문자 분할을 방지합니다.

$PATH는 find옵션이 도착하기 전에 분할되어 주요 인수로 표시됩니다. 카탈로그에서 해당 매개변수만 선택합니다. (dir에도 연결하려면 -L 옵션을 제공하십시오). 그런 다음 이 디렉터리의 첫 번째 수준으로 드릴다운하여 누군가(예: 사용자/그룹/기타)가 실행할 수 있는 파일을 가져옵니다.

관련 정보