sh 파일이 있습니다.
#!/bin/bash
echo $PATH
date
pwd
which nano
처음 세 줄은 #!/bin/bash 및 #!/bin/zsh에서 작동하지만 ./script.sh: line 5: which: command not found
bash를 얻었지만 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
따라서 스크립트의 이식성을 극대화하려면 이와 같은 기능을 사용하여 스크립트가 자체 버전을 포함하도록 하는 것이 좋습니다 .