고쳐 쓰다

고쳐 쓰다

PATH쉘 스크립트를 사용하여 특정 프로그램의 경로를 찾아야 합니다. 경로는 프로그램의 실제 전체 경로여야 하며 나중에 자체적 exec*으로 검색하지 않는 함수 중 하나 PATH(예: ) 에 전달될 수 있습니다 execv.

kill예를 들어 , 실제 프로그램과 내장 셸 기능을 동시에 수행하는 프로그램이 있습니다 . 이 경우 실제 프로그램의 전체 경로가 필요합니다.

PATH지정된 프로그램을 찾는 데 사용할 수 있는 여러 유틸리티가 있습니다.섹션 2.9.1.1, POSIX 표준 명령 검색 및 실행.

which, 어떤 표준에도 속하지 않습니다. 일부 시스템에서는 일반 프로그램일 수 있지만 일부 쉘에서는 내장 프로그램으로 제공됩니다. 대부분의 시스템과 셸에서 작동하는 것처럼 보이지만 내장 기능이 있는 셸도 실행 파일의 경로가 아닌 내장 이름만 반환합니다. 또한 어떤 방식으로든 표준화되지 않았으며 출력을 반환하고 다른 옵션을 사용할 수 있습니다.

bash# which kill
/usr/bin/kill
dash# which kill
/usr/bin/kill
fish# which kill
/usr/bin/kill
mksh# which kill
/usr/bin/kill
tcsh# which kill
kill: shell built-in command.
zsh# which kill
kill: shell built-in command

whence, 여러 쉘이 내장되어 있습니다. 그러나 많은 쉘에서는 사용할 수 없습니다. 또한 프로그램 경로 대신 내장 함수의 이름을 반환합니다. 이 동작을 변경하기 위해 A를 전달할 수 있습니다 -p.

bash# whence kill
bash: whence: command not found
dash# whence kill
dash: 1: whence: not found
fish# whence kill
fish: Unknown command 'whence'
mksh# whence kill
kill
mksh# whence -p kill
/usr/bin/kill
tcsh# whence kill
whence: Command not found.
zsh# whence kill
kill
zsh# whence -p kill
/usr/bin/kill

일부는commandPOSIX:2008 지정 내장. 불행하게도 일반 명령과 내장 명령도 검색하여 동일한 이름의 내장 명령에 의해 숨겨진 프로그램 경로 대신 내장 명령의 이름을 반환합니다. 일부 오래된 쉘은 아직 이를 구현하지 않습니다.

bash# command -v kill
kill
dash# command -v kill
kill
fish# command -v kill
/usr/bin/kill
mksh# command -v kill
kill
tcsh# command -v kill
command: Command not found.
zsh# command -v kill
kill

답변1

가서 직접 찾아보세요.

export IFS=":"
[ -z "${1}" ] && exit 1
for dir in $PATH
do if [ -x "${dir}/${1}" ]
   then echo "${dir}/${1}"
        exit 0
   fi
done
echo ${1} not found
exit 1

bash, dash, ksh, 에서 테스트 mkshzsh

고쳐 쓰다

위의 내용은 독립 실행형 스크립트에는 적합하지만 더 큰 스크립트에 포함시키려는 경우 다음과 같은 것을 사용하는 것이 좋습니다.

function find_path() {
   IFS_SAVE="${IFS}"
   export IFS=":"
   [ -z "${1}" ] && return 1
   for dir in $PATH
   do if [ -x "${dir}/${1}" ]
      then echo "${dir}/${1}"
           export IFS="${IFS_SAVE}"
           return 0
      fi
   done
   export IFS="${IFS_SAVE}"
   echo ${1} not found
   return 1
}

이는 IFS일치하는 항목을 찾은 후 복구하고 exit'를 return' 로 바꾸는 것입니다.

관련 정보