配列bash
はPIPESTATUS
パイプラインのコマンド戻り値を保持します。
パイプラインでcmd1 | cmd2 | cmd3
2番目のコマンドがエラーを返すとします。チェックはPIPESTATUS
失敗したコマンドのインデックスを提供しますが、コマンド自体の名前をどのように印刷しますかcmd2
?
パラメータも表示する方が良いですが、cmd2
コマンド名だけを印刷する答えを受け入れます。
ベストアンサー1
# put commands in an array, e.g.: cat /etc/passwd | grep 1555 | grep sh
cmd=("cat /etc/passwd" "grep 1555" "grep sh")
# execute commands
eval "${cmd[0]}" | eval "${cmd[1]}" | eval "${cmd[2]}"
# save PIPESTATUS
save=("${PIPESTATUS[@]}")
# print returncode and failed command
for ((i=0;i<${#save[@]};i++)); do
[[ ${save[$i]} -ne 0 ]] && echo "${save[$i]}: ${cmd[$i]}"
done
unset save cmd
出力(例):
1: grep 1555 1: grep sh