【问题标题】:How to terminate shell on 1st instance of failed command ( search for 1st instance of string and append to it )如何在失败命令的第一个实例上终止 shell(搜索字符串的第一个实例并附加到它)
【发布时间】:2014-02-21 20:39:10
【问题描述】:

我使用包装器自动生成一个文件,该包装器像这样并行执行一系列命令

C1 p1 p2 p3  > logfile1 2>& 1 &    # call is I_1

C1 p1 p2 p3  > logfile2 2>& 1 &    # I_2

C1 p1 p2 p3  > logfile3 2>& 1 &

C1 p1 p2 p3  > logfile4 2>& 1 &   

该文件已经由包装进程自动生成我想做的是这个。如果 I_1 失败,则终止 I_2 之后的所有内容。 我想这样做的一种方法是找到2>& 1 & 的第一个实例并将末尾的“&”删除到2>& 1,这将在fg 中运行它,然后将这些行{ rc= $? && [ "$rc" -ne 0 ] && return $rc ; } 添加到以下行。所以遵循这个 - 结果看起来像这样

C1 p1 p2 p3  > logfile1 2>& 1   # removed &
 { rc=$? && [ "$rc" -ne 0 ] && return $rc ; }

C1 p1 p2 p3  > logfile2 2>& 1 &    # I_2

C1 p1 p2 p3  > logfile3 2>& 1 &

C1 p1 p2 p3  > logfile4 2>& 1 &   

一些 AWK 或 Sed 可以完成这项工作。或者是否有更好的方法来实现这一点。

【问题讨论】:

    标签: shell search sed awk ksh


    【解决方案1】:

    在脚本顶部插入这一行:

    set -o errexit
    

    这将导致 bash 在第一次命令失败时终止脚本。

    【讨论】:

    • 是的,但我仍然必须取消第一个 & 以免所有命令并行提交并且该集合没有任何意义。所以必须使用这个 sed sed -i '0,/2>\&1\&/s/2>\&1\&/2>\&1/' filename 。希望这是有道理的,或者我错过了什么。
    • 正确,所以我在后台或并行触发 12 个命令,无论您想调用什么命令。因此,如果其中一个有错误 - 每个人都有相同的错误,并且设置标志将无效。它需要执行它可以控制的“测试”命令 1st。所以我用上面的方法让第一个进入前台还是我错过了什么
    • 我想把命令放在后台会让事情变得不同,因为调用 shell 已经开始了其余的工作。
    • 正确,所以 sed 将使第一个命令在 fg 中运行-因此您的设置标志有效-对吗?哦,顺便说一句,这是 ksh 而不是 bash 。假设同一套在那里工作 - 几乎可以肯定,但仅供参考。所有这一切都将在外壳从包装器运行之前发生。 Wrapper 制作 shell 然后运行它
    猜你喜欢
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    相关资源
    最近更新 更多