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