Bash
‘which’ 命令不能在帶有 #!/bin/bash 的 shell 腳本中工作,但可以在 #!/bin/zsh 中工作
我有一個 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 shell
bash
,然後鍵入,type which
我得到:which is aliased to `_which'
但是,如果我在 zsh 中並鍵入
bash -c "type which"
,我得到:bash: line 0: type: which: not found
並非所有命令都作為單獨的執行檔存在:某些命令可能內置在您使用的 shell 中。
顯然您還沒有
/usr/bin/which
安裝(儘管您的發行版中的某些軟體包可能會提供)。您的
type which
輸出表明which
命令 in實際上是一個別名,並且該別名僅在作為互動式shell呼叫bash
時才定義。這意味著它可能在or中定義,或者在源自其中之一的某些腳本中定義。bash``/etc/bash.bashrc``~/.bashrc
當以
bash
非互動方式執行(bash -c "type which"
例如)時,/etc/bash.bashrc
將~/.bashrc
跳過 和 ,因此不會定義別名。
_which
,反過來,可能是一個shell函式。你可以看到它的定義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
在其中攜帶自己的版本。