捕获bash匿名FIFO

时间:2015-07-19 21:47:53

标签: bash io-redirection

我正在编写一个脚本,该脚本使用匿名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

1 个答案:

答案 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=