如何在失败命令的第一个实例上终止shell(搜索字符串的第一个实例并附加到它)

如何在失败命令的第一个实例上终止shell(搜索字符串的第一个实例并附加到它),shell,search,sed,awk,ksh,Shell,Search,Sed,Awk,Ksh,我使用一个包装器自动生成一个文件,该包装器并行执行一系列命令,如下所示 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 &

我使用一个包装器自动生成一个文件,该包装器并行执行一系列命令,如下所示

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将完成这项工作。或者有更好的方法来实现这一点。

在脚本顶部插入这一行:

set -o errexit

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

是的,但我仍然必须停止第一个
&
,以免所有命令并行提交,而集合没有任何意义。所以必须使用这个sed
sed-i'0,/2>\&1\&/s/2>\&1\&/2>\&1/'filename
。希望这是有意义的,或者我遗漏了什么。正确,所以我在后台或并行地发出12个命令,不管你怎么称呼它。因此,如果其中一个有错误-每个人都有相同的错误,设置标志将无效。它需要根据它可以控制的“测试”命令进行操作。因此,我使用上面的方法在前台执行第一个命令,或者我遗漏了一些东西。我猜将命令放在后台会使这里的情况有所不同,因为调用shell已经开始了其余的工作。对,因此sed将使第一个命令在fg中运行-因此您的设置标志有效-对吗?哦,顺便说一句,这是ksh而不是bash。假设相同的设置在那里工作-几乎可以肯定,但仅供参考。所有这些都将在从包装器运行shell之前发生。包装器生成外壳,然后运行它