受此答案的启发:当我type -p
在命令提示符下运行时,如果命令存在,它会可靠地告诉我路径:
pi@raspberrypi:~ $ type -p less
/usr/bin/less
pi@raspberrypi:~ $ type -p asdf
pi@raspberrypi:~ $
但是,当在脚本中使用时,就好像-p
参数被解释为自身的命令一样。该type
命令似乎忽略了它作为它的选项,因为结果中总是有一些流氓文本-p not found
。它破坏了脚本的其余部分:
#!/usr/bin/sh
main() {
for mycommand in $1; do
echo Checking $mycommand
loc="$(type -p "$mycommand")"
echo $loc
if ! [ -f "$loc" ]; then
echo I think I am missing $mycommand
fi
done
}
main "less asdf"
脚本的输出:
Checking less
-p: not found less is /usr/bin/less
I think I am missing less
Checking asdf
-p: not found asdf: not found
I think I am missing asdf
你能帮帮我吗?树莓派上的外壳是否有导致这种情况的原因?
-p
不是type
命令¹的标准选项。该type
实用程序本身,虽然标准在 POSIX 中是可选的(仅在实现 XSI 的系统上需要,但这是获得 UNIX 合规性认证所必需的)。代替
type
,您可以使用command -v
来检查命令的可用性。无需检查其输出,command
将通过其退出状态告诉您是否成功找到该命令(无论它是在 中找到的外部命令$PATH
、内置命令还是函数):command
是一个强制性的 POSIX 实用程序。该-v
选项command
过去是可选的,但在最新版本的 POSIX 规范中不再存在。另请记住,
echo
不能用于显示任意数据,--
必须用于分隔选项和非选项,错误(以及一般诊断,包括进度/建议信息)最好转到 stderr。¹ 但是,它是、 、 、 和shells²的内置函数支持
type
的选项。在and中,它意味着在标准中搜索命令(例如由返回),在 中,它仅用于在 中搜索命令,而不是在 aliases/builtins/functions 中。中相同,除了它也只打印找到的命令的路径。在(以前的位置;尽管不再记录但仍受支持),成功但如果命令是内置命令则不打印任何内容,并且仅在 ksh93 中打印路径,当它是外部命令时。在中,它的行为类似于bash
mksh
ksh93
busybox ash
zsh
yash
mksh
yash
$PATH
getconf PATH
zsh
$PATH
ksh93
bash
-path
type -p
busybox ash
command -v
sh
²至少在调用 as 时,标准语言的所有或多或少一致的解释器实现sh
,尽管这并不妨碍它们在标准未指定行为的区域中支持对该语言的扩展,如此处。