"which" 명령은 #!/bin/bash를 사용하는 쉘 스크립트에서는 작동하지 않지만 #!/bin/zsh를 사용하면 작동합니다.

"which" 명령은 #!/bin/bash를 사용하는 쉘 스크립트에서는 작동하지 않지만 #!/bin/zsh를 사용하면 작동합니다.

sh 파일이 있습니다.

#!/bin/bash
echo $PATH
date
pwd
which nano

처음 세 줄은 #!/bin/bash 및 #!/bin/zsh에서 작동하지만 ./script.sh: line 5: which: command not foundbash를 얻었지만 zsh는 파일을 제대로 실행합니다. 왜?

zsh에서 bash 쉘을 입력하고 bash입력하면 다음과 같은 결과 type which가 나타납니다.

which is aliased to `_which'

하지만 zsh에 있고 type 을 입력하면 다음과 같은 결과가 bash -c "type which"나타납니다.

bash: line 0: type: which: not found

답변1

모든 명령이 별도의 실행 파일로 존재하는 것은 아닙니다. 일부 명령은내장사용중인 쉘에.

분명히 아직 설치하지 않은 것 같습니다 /usr/bin/which(배포판의 일부 패키지에서 이를 제공할 수도 있음).

출력 type which에 따르면 which의 명령은 bash실제로 별칭이고 별칭은 다음 용도로만 bash사용 됩니다.인터렉티브껍데기. 이는 아마도 그 중 하나에서 시작된 일부 스크립트에 /etc/bash.bashrc정의되어 있음을 의미합니다.~/.bashrc

실행시bash 비대화형으로(예 bash -c "type which": ) /etc/bash.bashrc및 는 ~/.bashrc건너뛰므로 별칭이 정의되지 않습니다.

_which결과적으로 이는 쉘 함수일 수도 있습니다. 이를 사용하여 정의를 볼 수 있습니다 type _which. 아마도 다음과 같은 것일 수도 있습니다.

which() { 
   IFS=:
   for x in $PATH; do
      if [ -x "$x/$1" ]; then
         echo "$x/$1"
         return 0
      fi
   done
   echo "$1 not found in \$PATH"
   return 1
}

which따라서 스크립트의 이식성을 극대화하려면 이와 같은 기능을 사용하여 스크립트가 자체 버전을 포함하도록 하는 것이 좋습니다 .

관련 정보