当当前 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]}"