4

我有一系列命令要执行。但是,每当出现“找不到命令”错误时,我都需要退出。所以输出的执行后检查不是一个选项

“$?” 当“未找到命令”且成功时,变量为零。

4

3 回答 3

6

如果这应该从脚本中完成,使用条件来表达这种行为是很自然的:

asdf 2> /dev/null || exit 1
于 2013-06-04T13:59:41.943 回答
6

如果未找到该命令,则退出状态应为 127。但是,您可能正在使用bash4 或更高版本,并且有一个名为command_not_found_handledefined 的函数。如果找不到命令,则调用此函数,它可能会退出 0,屏蔽 127 代码。

如果定义了函数,运行type command_not_found_handle将显示函数的定义。您可以通过运行来禁用它unset command_not_found_handle

于 2013-06-04T13:05:27.390 回答
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可以是任何东西(内置、别名、二进制...),那么可以使用:

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
于 2013-06-04T12:49:23.270 回答