检测在bash脚本中找不到的命令

时间:2013-06-04 12:48:13

标签: linux bash shell

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

“$?”当“未找到命令”时和成功时,变量等于零。

3 个答案:

答案 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可以是任何内容(内置,别名,二进制,......),则可以使用此方法:

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