Bash

‘which’ 命令不能在帶有 #!/bin/bash 的 shell 腳本中工作,但可以在 #!/bin/zsh 中工作

  • September 21, 2020

我有一個 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在其中攜帶自己的版本。

引用自:https://unix.stackexchange.com/questions/610602