2013-06-04 62 views
2

我有一系列的命令来执行。但是,只要'找不到命令'就会出现错误,我需要退出。所以执行输出检查不是一个选项检测命令在bash脚本中找不到

“$?” '找不到'命令时,变量等于零。

+0

的[检查程序从一个bash脚本存在(HTTP可能重复/stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script) – blong

回答

3

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

asdf 2> /dev/null || exit 1 
+0

这实际上是最简单和最干净的方式,ty – GoTTimw

+0

'ls/this/file/does/not/exist 2>/dev/null'如何? ls命令仍然存在。 – anishsane

+0

@anishsane当然。没有人说这会排除其他命令失败的情况。 – 2013-06-04 16:30:44

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 
+2

这只有在'$ executable'是您要查找的可执行文件的路径时才有效。 '-x'不执行路径查找。 – chepner

+0

@chapner:你说得对!它不检测内部bash命令。它可以用例如'type'。 – TrueY

+0

@chapner:我根据你的评论更新了我的答案。请看看它! – TrueY

4

如果没有找到命令,退出状态应该是127.但是,你可能会使用bash 4或更高版本,并具有定义的称为command_not_found_handle的功能。如果找不到命令,则调用此函数,并且它可能会退出0,屏蔽127代码。

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