我有一系列命令要执行。但是,每当出现“找不到命令”错误时,我都需要退出。所以输出的执行后检查不是一个选项
“$?” 当“未找到命令”且成功时,变量为零。
如果这应该从脚本中完成,使用条件来表达这种行为是很自然的:
asdf 2> /dev/null || exit 1
如果未找到该命令,则退出状态应为 127。但是,您可能正在使用bash
4 或更高版本,并且有一个名为command_not_found_handle
defined 的函数。如果找不到命令,则调用此函数,它可能会退出 0,屏蔽 127 代码。
如果定义了函数,运行type command_not_found_handle
将显示函数的定义。您可以通过运行来禁用它unset command_not_found_handle
。
更新
尝试
[ -x "$executable" ] && echo "Command '$executable' not found" >&2 && exit 1
这将向 stderr 写入错误并以 1 个退出代码退出。
如果您只有实用程序的名称,您可以使用type
内置检查其路径。
例子:
type type
type ls
type xls
输出:
type is a shell builtin
ls is /usr/bin/ls
./test.sh: line 13: type: xls: not found
如果未找到实用程序,则测试返回 1。
因此,如果$executable
可以是任何东西(bash内置、别名、二进制...),那么可以使用:
type -p ls>/dev/null && ls -l
type -p xls>/dev/null && xls --some_arg
这将运行ls
(任何可执行文件),但不是 xls。
无论如何,如果在脚本execfail
中未设置选项(shopt
),那么脚本将在说明bash: some_utility: command not found
错误消息后退出。如果设置了此选项,则继续。但是您可以trap
使用伪信号ERR
并执行您需要的操作:
shopt -s execfail
fnc() { echo $?, $_, Oops;}
trap fnc ERR
ls -d *|head -2
xls
yls
输出:
a1
a2
./test_tLcn.sh: line 8: xls: command not found
127, xls, Oops
./test_tLcn.sh: line 9: yls: command not found
127, yls, Oops