在bash脚本中,您可以通过执行以下操作来检查错误:
if some_command; then
printf 'some_command succeeded\n'
else
printf 'some_command failed\n'
fi
如果您的脚本较大,则经常必须执行此操作非常繁琐且冗长。编写一个函数会很好,因此您所要做的就是传递命令,并使其输出是失败还是成功,如果失败则退出。
我考虑过做这样的事情:
function cmdTest() {
if $($@); then
echo OK
else
echo FAIL
exit
fi
}
因此,可以通过执行类似
cmdTest ls -l
的操作来调用它,但是当我这样做时,我得到:ls -l: Command not found
。到底是怎么回事?我怎样才能解决这个问题?
谢谢。
最佳答案
您的cmdtest
函数仅限于简单命令(无管道,无&&
/||
,无重定向)及其参数。只需输入几下即可使用更强大的功能
{ ... ;} && echo OK || { echo Fail; exit 1; }
其中
...
将由您可能要执行的任何命令行替换。对于简单的命令,不需要大括号和尾部分号,但是通常您需要它们,以确保您使用
&&
的命令行被视为单个命令。如果您尝试运行类似
cmdTest grep "foo" file.txt || echo "foo not found"
您的函数只能运行
grep "foo" file.txt
,如果函数失败,则echo "foo not found" would run. An attempt to pass the entire
x || y`对你的功能像cmdTest 'grep "foo" file.txt || echo "foo not found"
失败的后果更糟:整个命令字符串将被视为命令名称,这不是您想要的。同样,您不能通过管道
cmdTest grep "foo" file.txt | grep "bar"
因为管道包含两个命令:
cmdTest grep "foo" file.txt
和grep "bar"
。Shell(不管是
bash
,zsh
,POSIX sh
还是几乎其他任何类型)都不是一种用于将任意命令行作为要执行的另一个函数的参数传递的语言。要使用eval
命令,唯一的解决方法最好是脆弱,最坏的情况是存在安全风险,因此不能建议这样做。 (而且,即使容量有限,我也不会提供如何使用eval
的示例。)
关于bash - bash中的错误检查功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25921142/