Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Linux:在不丢失单个返回码的情况下运行多个命令?_Java_Linux_Bash_Command Line - Fatal编程技术网

Java Linux:在不丢失单个返回码的情况下运行多个命令?

Java 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.

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

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

Java端的当前实现创建n
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))
    测试。因此,如果
    r
    全为零,子shell将报告成功。否则,子shell将报告失败(
    $?==1
负出口值 如果子shell中的某些程序可能具有负的退出值,那么这可能仍然有效。例如,
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))
    测试。因此,如果
    r
    全为零,子shell将报告成功。否则,子shell将报告失败(
    $?==1
负出口值 如果子shell中的某些程序可能具有负的退出值,那么这可能仍然有效。例如,
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