我有一个 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
答案1
并非所有命令都作为单独的可执行文件存在:某些命令可能是内置到您正在使用的外壳。
显然您还没有/usr/bin/which
安装(尽管您的发行版中的某些软件包可能提供了该安装)。
您的type which
输出表明which
命令 inbash
实际上是一个别名,并且该别名仅在bash
作为交互的壳。这意味着它可能是在/etc/bash.bashrc
or中定义的~/.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
其中携带自己的版本。