$(...|...) コマンドの PIPESTATUS

$(...|...) コマンドの PIPESTATUS

現在のシェルに変数が設定されている場合、コマンドを読み取るには${PIPESTATUS[0]?どういうわけかこれを現在のシェルに渡す方法はありますか?

変数を設定していますが、メール属性が実際にLDAPに存在しないと判断する前に変数が失敗しないことを確認したいとMAIL=$(ldapsearch.... | find_for_mail)思います。ldapsearch

$ 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変数を親プロセスから子プロセスに環境変数にエクスポートすることです。終了コードの1つだけに興味がある場合は、次のコードを使用できます。

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

答え2

Linuxでこれを行う1つの方法は、一時ファイルを使用してデータを渡すことです(<<<一時ファイルを使用)。

{
  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]}"

関連情報