我正在编写一个脚本,该脚本使用匿名FIFO来获取命令的输出,该命令期望输出文件作为参数并将其提供给接受来自stdin的输入的命令。设置如下:
OUTPUT=$( cmd1 args >( cmd2 args - ) 2>&1 )
echo $? # echoes 0
如果OUTPUT
的结果不为零,我想要做的是选择回显cmd2
。 $?
似乎反映了OUTPUT
的分配或cmd1
的结果,因为如果我运行以下1
,则会回显$?
0
1}}。
OUTPUT=$( cmd1 args >( cmd2 args - ; echo $?) 2>&1 ) # echoes 1
echo $? # echoes 0
$PIPESTATUS
特殊变量也匹配$?
的输出。
OUTPUT=$( cmd1 args >( cmd2 args - ; echo $?) 2>&1 ) # echoes 1
echo ${PIPESTATUS[@]} # echoes 0
答案 0 :(得分:3)
虽然您没有提供cmd1或cmd2的任何具体示例,但它似乎是:
cmd1 args >( cmd2 args - )
可以重新排列为:
cmd2 args <(cmd1 args /dev/stdout); echo $?
echo语句报告cmd2
的状态。
$ cat cmd1
#!/bin/sh
sed "$1" "$2" >"$3"
和
$ cat cmd2
#!/bin/sh
grep Y "$@"
让我们使用测试文件:
$ cat file
input
现在,请注意报告了正确的退出代码:
$ cmd2 <( cmd1 's/input/Y/' file /dev/stdout) ; echo $?
Y
0
$ cmd2 <( cmd1 's/input/N/' file /dev/stdout) ; echo $?
1
此外,我们可以将stdout捕获到变量output
:
$ output=$( cmd2 <( cmd1 's/input/Y/' file /dev/stdout) ) ; echo code=$? output=$output
code=0 output=Y
$ output=$( cmd2 <( cmd1 's/input/N/' file /dev/stdout) ) ; echo code=$? output=$output
code=1 output=