Linux 检测bash脚本中未找到的命令

Linux 检测bash脚本中未找到的命令,linux,bash,shell,Linux,Bash,Shell,我有一系列的命令要执行。但是,每当发生“未找到命令”错误时,我都需要退出。因此,输出的执行后检查不是一个选项 当“找不到命令”且成功时,“$?”变量等于零。已更新 试一试 这将向stderr写入一个错误,并以1个退出代码退出 如果您只有实用程序的名称,则可以使用类型内置项检查其路径 例如: type type type ls type xls 输出: type is a shell builtin ls is /usr/bin/ls ./test.sh: line 13: type: xls:

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


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

已更新

试一试

这将向stderr写入一个错误,并以1个退出代码退出

如果您只有实用程序的名称,则可以使用
类型
内置项检查其路径

例如:

type type
type ls
type xls
输出:

type is a shell builtin
ls is /usr/bin/ls
./test.sh: line 13: type: xls: not found
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
如果找不到实用程序,测试返回1

因此,如果
$executable
可以是任何内容(内置、别名、二进制等),则可以使用:

type -p ls>/dev/null && ls -l
type -p xls>/dev/null && xls --some_arg
这将运行
ls
(任何可执行文件),但不会运行xls

无论如何,如果脚本中未设置
execfail
选项(
shopt
),则脚本将在声明
bash:some\u utility:command not found
错误消息后退出。如果设置了此选项,则它将继续。但是您可以
trap
伪信号
ERR
并执行您需要的操作:

shopt -s execfail
fnc() { echo $?, $_, Oops;}
trap fnc ERR

ls -d *|head -2
xls
yls
输出:

type is a shell builtin
ls is /usr/bin/ls
./test.sh: line 13: type: xls: not found
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

如果未找到该命令,则退出状态应为127。但是,您可能正在使用
bash
4或更高版本,并定义了名为
command\u not\u found\u handle
的函数。如果找不到命令,则调用此函数,它可能会退出0,从而屏蔽127代码


运行
type命令\u not\u found\u handle
将显示函数的定义(如果已定义)。您可以通过运行
unset命令\u not\u found\u handle

来禁用它。如果应该从脚本执行此操作,则自然可以使用条件来表示这种行为:

asdf 2> /dev/null || exit 1

只有当
$executable
是您要查找的可执行文件的路径时,这才有效
-x
不执行路径查找。@查普纳:你说得对!它不检测内部bash命令。可以用
键入
@chapner:我根据你的评论更新了我的答案。请看一看!陷阱
ERR
似乎过于宽泛,因为该函数将在任何错误上运行,而不仅仅是命令未找到错误。@chepner:Yes。但是如果
$?
为127,则可以检测到发生了命令未找到错误
$\uu
可用于打印找不到的实用程序。这实际上是最简单、最简洁的方法,
ls/this/file/does/not/exist 2>/dev/null
如何?ls命令仍然存在。@anishsane当然。没有人说这将排除其他命令失败的情况。+1!即使调用的程序不存在,我也不知道它正在工作。Thx!可能重复的