我有一系列要执行的命令。但是,每当“找不到命令”错误发生时我都需要退出。因此,对输出的执行后检查不是一个选项
“$?”当“未找到命令”时和成功时,变量等于零。
答案 0 :(得分:5)
如果未找到该命令,则退出状态应为127.但是,您可能正在使用bash
4或更高版本,并且已定义了名为command_not_found_handle
的函数。如果找不到命令,则调用此函数,它可以退出0,屏蔽127代码。
运行type command_not_found_handle
将显示函数的定义(如果已定义)。您可以通过运行unset command_not_found_handle
来停用它。
答案 1 :(得分:3)
如果这应该从脚本中完成,那么使用条件来表达这种行为是很自然的:
asdf 2> /dev/null || exit 1
答案 2 :(得分:1)
<强>已更新强>
尝试
[ -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