gpt4 book ai didi

Linux:运行多个命令而不丢失单个返回码?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:14 24 4
gpt4 key购买 nike

我读了this question ,但我的问题是我有“大量”命令要运行;我需要一个适用于系统调用的解决方案。

我们有一个退出任务,基本上会触发 JVM 中的大量“清理”事件。我正在处理的部分必须调用某个脚本,不是一次,而是 n 次!

Java 端的当前实现创建了 nProcessBuilder 对象;每个运行一个简单的 bash script.sh parm ... 其中 parm 在每次运行时都不同。

现在我想将 Java 端更改为使用 ProcessBuilder 仅进行 一次 系统调用(而不是 n)。

我可以只使用以下命令:

bash script.sh parm1 ; bash script.sh parm2 ; ... ; bash script.sh parmN

现在的问题是:如果其中一次运行失败……我希望所有其他运行仍然进行;但我想最后得到一个“坏”的返回码。

是否有一种简单、优雅的方法来实现这一点,即处理来自系统调用的命令字符串?

最佳答案

您可以随时在子 shell 中构建返回码,然后在最后使用算术评估检查它们。例如,在我的测试系统 (cygwin) 上,在 bash 提示符下:

$  ( r=; echo "foo" ; r=$r$?; echo "bar" ; r=$r$? ; echo "baz" ; r=$r$? ; (($r==0)) )
foo
bar
baz
$ echo $?
0 <--- all the commands in the subshell worked OK, so the status is OK

                                        VVVV make this echo fail
$ ( r=; echo "foo" ; r=$r$?; echo "bar" 1>&- ; r=$r$? ; echo "baz" ; r=$r$? ; (($r==0)) )
foo
-bash: echo: write error: Bad file descriptor
baz
$ echo $?
1 <--- failure code, but all the commands in the subshell still ran.

所以,在你的情况下,

(r=; bash script.sh parm1 ; r=$r$?; bash script.sh parm2 ; r=$r$?; ... ; bash script.sh parmN r=$r$?; (($r==0)) )

您还可以使用函数 s 稍微缩短它隐藏返回码:

$ (r=;s(){ r=$r$?;}; echo "foo" ; s; echo "bar" 1>&-; s; echo "baz" ; s; (($r==0)) )
foo
-bash: echo: write error: Bad file descriptor
baz
$ echo $?
1

s(){ r=$r$?;}定义一个函数 s这将更新 r .然后 s可以在每个命令之后运行。 s定义中的空格和分号是必需的。

发生了什么事?

  • r=初始化 r到一个空字符串。这将保留我们的返回值。
  • 在每个命令之后,r=$r$?将该命令的退出状态添加到 r . r 中没有空格, 通过构造,所以为了简洁起见,我省略了引号。有关负返回值的注释,请参见下文。
  • 最后,(($r==0))如果 r 则成功评估为 0 .所以,如果所有命令都成功,r将是 000 ... 0 , 等于 0 .
  • 子shell 的退出状态是其最后一个命令的退出状态,这里是(($r==0))。测试。所以如果r全为零,子 shell 将报告成功。否则,子 shell 将报告失败 ( $?==1 )。

负退出值

如果子 shell 中的某些程序可能具有负退出值,这可能仍然有效。例如,0-255100255是不等于零的有效表达式。但是,如果您有两个命令,第一个以 127 退出。 , 第二个以 -127 退出, r将是 127-127 ,这是零。

为避免此问题,请替换每个 r=$r$?r=$r$((! ! $?)) .双重逻辑否定 $((! ! $?))转换 00和任何其他正值或负值,到 1 .那么r将只包含 01值,所以 (($r==0))测试将是正确的。 (每个 ! 后确实需要空格,因此 bash 不会认为您在尝试引用命令历史记录。)

关于Linux:运行多个命令而不丢失单个返回码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41463875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com