“which”命令不能在 shell 脚本中使用 #!/bin/bash 工作,但可以使用 #!/bin/zsh

“which”命令不能在 shell 脚本中使用 #!/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 shell bash,然后键入type which我得到:

which is aliased to `_which'

但是如果我在 zsh 中并输入bash -c "type which",我得到:

bash: line 0: type: which: not found

答案1

并非所有命令都作为单独的可执行文件存在:某些命令可能是内置到您正在使用的外壳。

显然您还没有/usr/bin/which安装(尽管您的发行版中的某些软件包可能提供了该安装)。

您的type which输出表明which命令 inbash实际上是一个别名,并且该别名仅在bash作为交互的壳。这意味着它可能是在/etc/bash.bashrcor中定义的~/.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其中携带自己的版本。

相关内容