来自 $(...|...) 中命令的 PIPESTATUS

来自 $(...|...) 中命令的 PIPESTATUS

当当前 shell 中设置了变量时,如何读取${PIPESTATUS[0]命令?有没有办法以某种方式将其传递到当前外壳?

我正在设置变量MAIL=$(ldapsearch.... | find_for_mail),并希望ldapsearch在确定邮件属性在 LDAP 中并不真正存在之前确定自身是否没有失败。

$ true | false
$ echo ${PIPESTATUS[0]} ${PIPESTATUS[1]}
0 1
$ Z=$(true | false)
$ echo ${PIPESTATUS[0]}
1                        <--- why 1?
$ echo ${PIPESTATUS[1]}

$ Z=$(true | false;echo ${PIPESTATUS[0]} ${PIPESTATUS[1]})
$ echo $Z
0 1
$ Z=$(true | false;C="${PIPESTATUS[0]} ${PIPESTATUS[1]}")
$ echo $C

$ Z=$(true | false;export C="${PIPESTATUS[0]} ${PIPESTATUS[1]}")
$ echo $C

答案1

问题在于export将变量作为环境变量从父进程导出到子进程,而不是相反。如果您只对其中一种退出代码感兴趣,可以使用以下代码:

$ Z=$(false | true; exit ${PIPESTATUS[0]})
$ echo $?
1

答案2

在 Linux 上执行此操作的一种方法是使用临时文件传递数据(<<<碰巧使用临时文件)。

{
  output=$(cmd1 | cmd2 | cmd3; printf '%s\n' "${PIPESTATUS[@]}" > /dev/fd/3)
  readarray -t cmdsubst_pipe_status <&3
} 3<<< ''
printf '%s\n' "cmd1's status: ${cmdsubst_pipe_status[0]}"

相关内容