스크립트가 $PATH의 모든 실행 파일을 표시하지 않습니다.

스크립트가 $PATH의 모든 실행 파일을 표시하지 않습니다.

Ubuntu에서 모든 디렉토리의 모든 실행 파일을 변수로 표시하는 스크립트를 작성하고 싶습니다 $PATH. 이것은 내 스크립트입니다.

#!/bin/bash
IFS=:
for dir in $PATH;do
        echo $dir:
        for files in $dir/*;do
                b=$(basename $files)
                [ -x "$b" ] && echo $"    $b" 
        done
done 

그러나 출력은

/usr/local/sbin:
/usr/local/bin:
/usr/sbin:
/usr/bin:
/sbin:
/bin:
/usr/games:
/usr/local/games:
/snap/bin:
/home/sudin/programming/shell:
      brightness
      for
      ifthen
      loop
      mat2
      myfind
      searchex

다른 디렉터리의 실행 파일이 나열되지 않는 이유는 무엇입니까?

답변1

그리고

[ -x "$b" ]

해당 이름의 파일이 에 저장되어 있는지 테스트하고 있습니다 $b.아니요PATH경로, 실행 파일이므로 스크립트는 현재 디렉터리의 실행 파일과 일치하는 항목 만 찾습니다 .

전체 경로를 테스트하면 문제가 해결됩니다.

[ -x "$files" ] && printf "    %s\n" "$b"

그 동안 인용문을 수정해 보겠습니다.

#!/bin/bash
IFS=:
for dir in $PATH;do
        printf "%s:\n" "$dir"
        for files in "$dir"/*;do
                b="$(basename "$files")"
                [ -x "$files" ] && printf "    %s\n" "$b"
        done
done

바라보다쉘에 알려진 모든 명령 나열보다 포괄적인 솔루션을 위해 빈 항목 PATH, 글로브 및 디렉토리가 포함된 잘못된 형식의 항목을 처리합니다.

관련 정보