【问题标题】:Executing multiple Bash commands after OR在 OR 之后执行多个 Bash 命令
【发布时间】:2018-11-10 05:41:03
【问题描述】:

我正在编写一个 Bash 脚本来安装一些软件;有没有办法创建一个在 OR 之后执行多个命令的单行程序?基本上,我想要做的错误检查是这样的:

sudo apt-get install fortune || (echo "Installation failed" ; exit)
echo "Installation successful"

我试过这个,但是安装失败时它并没有退出脚本,并且仍然输出“安装成功”。关于如何编辑此方法以使其工作的任何想法?

【问题讨论】:

    标签: linux bash error-handling scripting


    【解决方案1】:

    括号创建一个子shell,这是exit 命令退出的内容。你想要一个用大括号定义的命令group

    sudo apt-get install fortune || { echo "Installation failed" >&2; exit 1; }
    

    (注意最后一个分号和大括号周围的空格;所有这些都很重要。)

    为了使内容更具可读性,通常您定义一个函数来充当|| 之后的单个命令:

    abort () { echo "Installation of $1 failed" >&2; exit 1; }
    
    sudo apt-get install fortune || abort fortune
    

    【讨论】:

    • 另外两个建议:将错误消息发送到 stderr 而不是 stdout(这就是它的用途),并以非零状态退出(表示出现错误)。
    • 这太完美了,谢谢!如果我想获取刚刚执行的函数的退出代码,如何将其发送到您刚刚编写的abort 函数?我可以分配$吗?到其中的一个变量,然后回显?
    • @AndreasKralj,考虑die() { retval=$?; echo "$*" >&2; exit $(( retval ? retval : 1 )); }——因此,foo || die "foo failed" 将通过foo 的退出状态,而die whatever$? 为0 将使用1。跨度>
    • 如果您不再试图过于冗长,这一切都会变得容易得多。 apt-get 打印出完全合理的错误消息,并且您不会通过编写“安装 $1 失败”来添加太多信息。如果直接省略,可以直接写sudo apt-get install fotrune || exit,sudo返回的值会被脚本返回。 (exit with you 参数与exit $? 相同,如果你想明确写exit $?)。
    • @William Pursell 是的,我明白,但我想禁止向终端输出除我的错误消息之外的所有输出,这样终端不会转储一堆信息,它只会输出是否命令成功与否。我将输出保存到用户可以检查错误的日志文件中。简单地退出对用户没有帮助,因为他们不知道出了什么问题。我将它与我编写的加载函数结合使用,该函数将通过显示“微调器”来指示命令正在进行中,以便用户知道命令仍在运行。
    猜你喜欢
    • 2017-12-20
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多