Java Linux:在不丢失单个返回码的情况下运行多个命令?
我读过,但我的问题是我有“大量”的命令要运行;我需要一个解决方案,它适用于系统调用 我们有一个退出任务,它基本上会触发JVM中的许多“清理”活动。我正在处理的部分必须调用某个脚本,不是一次,而是n次 Java端的当前实现创建nJava Linux:在不丢失单个返回码的情况下运行多个命令?,java,linux,bash,command-line,Java,Linux,Bash,Command Line,我读过,但我的问题是我有“大量”的命令要运行;我需要一个解决方案,它适用于系统调用 我们有一个退出任务,它基本上会触发JVM中的许多“清理”活动。我正在处理的部分必须调用某个脚本,不是一次,而是n次 Java端的当前实现创建nProcessBuilder对象;每一个都运行一个简单的bash script.sh parm。。。其中,parm在每次运行时是不同的 现在我想将Java端更改为只使用ProcessBuilder进行一次系统调用(而不是n次) 我可以使用以下命令: bash script.
ProcessBuilder
对象;每一个都运行一个简单的bash script.sh parm
。。。其中,parm
在每次运行时是不同的
现在我想将Java端更改为只使用ProcessBuilder
进行一次系统调用(而不是n次)
我可以使用以下命令:
bash script.sh parm1 ; bash script.sh parm2 ; ... ; bash script.sh parmN
现在的问题是:如果其中一次失败。。。我希望所有其他跑步都能继续进行;但我希望最终得到一个“坏”的返回码
有没有一种简单、优雅的方法可以实现这一点,一种可以处理来自系统调用的命令字符串的方法?您可以这样做
bash script.sh parm1 | | echo“失败”>some.log;bash script.sh parm2 | | echo“失败”>some.log;bash script.sh parmN | | echo“失败”>some.log
然后检查是否有一些.log文件
||-它是简单的bash逻辑or(如果前一个的退出状态为非零,则执行)您可以这样做
bash script.sh parm1 | | echo“失败”>some.log;bash script.sh parm2 | | echo“失败”>some.log;bash script.sh parmN | | echo“失败”>some.log
然后检查是否有一些.log文件
||-它是简单的bash逻辑or(如果前一个的退出状态为非零,则执行)您可以在运行时在子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
您还可以使用一个存储返回代码的函数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$?;}
定义将更新r
的函数s
。然后可以在每个命令后运行s
。s
定义中的空格和分号是必需的
发生了什么事?
将r=
初始化为空字符串。这将保持我们的返回值r
- 在每个命令之后,
将该命令的退出状态固定到r=$r$?
上。根据构造,r
中没有空格,因此为了简洁起见,我省略了引号。有关负返回值的说明,请参见下文r
- 最后,如果
的计算结果为r
,则0
成功。因此,如果所有命令都成功,($r==0))
将是r
…000
,这等于0
0
- 子shell的退出状态是其最后一个命令的退出状态,这里是
测试。因此,如果($r==0))
全为零,子shell将报告成功。否则,子shell将报告失败(r
)$?==1
0-255100255
是一个不等于零的有效表达式。但是,如果您有两个命令,第一个命令以127
退出,第二个命令以-127
退出,r
将是127-127
,该值为零
为避免此问题,请将每个
r=$r$?
替换为r=$r$(!!$?)
。双逻辑否定$(!!$?)
将0
转换为0
,将任何其他值(正或负)转换为1
。然后r
将只包含0
和1
值,因此($r==0))
测试将是正确的。(每个!
后面都需要空格,这样bash就不会认为您在试图引用命令历史记录。)您可以在子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
您还可以使用一个存储返回代码的函数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$?;}
定义将更新r
的函数s
。然后可以在每个命令后运行s
。s
定义中的空格和分号是必需的
发生了什么事?
将r=
初始化为空字符串。这将保持我们的返回值r
- 在每个命令之后,
将该命令的退出状态固定到r=$r$?
上。根据构造,r
中没有空格,因此为了简洁起见,我省略了引号。有关负返回值的说明,请参见下文r
- 最后,如果
的计算结果为r
,则0
成功。因此,如果所有命令都成功,($r==0))
将是r
…000
,这等于0
0
- 子shell的退出状态是其最后一个命令的退出状态,这里是
测试。因此,如果($r==0))
全为零,子shell将报告成功。否则,子shell将报告失败(r
)$?==1
0-255100255
是一个不等于零的有效表达式。但是,如果您有两个命令,第一个命令以127
退出,第二个命令以-127
退出,r
将是127-127
,该值为零
为避免此问题,请将每个r=$r$?
替换为r=$r$(!!$?)
。双逻辑求反$(!!$?)
将0
转换为0
和任何其他正值
excode=((excode | $?))
#!/bin/bash
excode=0
for i
do cmd "$i"
excode=((excode | $?))
done
echo "The final exit code is $excode"
# if [[ $excode -ne 0 ]]; exit 1; fi # An alternative exit solution.
callcmd parm1 parm2 parm3 … parmi … parmN