bash - bash中的错误检查功能

标签 bash function command-line error-handling

在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.txtgrep "bar"

Shell(不管是bashzsh,POSIX sh还是几乎其他任何类型)都不是一种用于将任意命令行作为要执行的另一个函数的参数传递的语言。要使用eval命令,唯一的解决方法最好是脆弱,最坏的情况是存在安全风险,因此不能建议这样做。 (而且,即使容量有限,我也不会提供如何使用eval的示例。)

关于bash - bash中的错误检查功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25921142/

相关文章:

CSS url() 函数 : Browser support

c - 为什么以下两个语句的输出不同?

linux - 在 Linux 上使用命令行工具进行文件操作

command-line - zsh:未找到 strftime 命令

bash - grep 到 sed,在字符串匹配之后追加,但在行尾追加

linux - 无法将密码传递给 su

bash - 使用从 bash 中的文件读取的数组并行化 while 循环

jquery - 如何告诉 jQuery 仅在一个特定网页上运行某个函数?

mysql - "-bash: mysql: command not found"- 尝试连接到远程 MYSQL 数据库

bash - 在本地 bash 函数变量中为脚本设置环境变量