evalでのコマンド実行時のPIPESTATUSの参照(bash) [Linux]
1. eval でのコマンド実行時の PIPESTATUS の参照(bash)
2. サンプルコードと実行例
3. 参考情報
bash では、PIPESTATUS を参照することにより、パイプラインの途中のコマンドの終了ステータスを取得できる。
% bash -c 'true|false|(exit 2); echo ${PIPESTATUS[@]}' 0 1 2
ほとんどの場合、@ を * に置き換えても同様の結果が得られる($@ と $* の違いと同様)。
しかし、eval でのコマンド実行時には、上記の方法では PIPESTATUS を参照できない。
cmd="command1 | command2 | command3" eval $cmd echo ${PIPESTATUS[@]}
このような場合には、下記のようにすることで参照可能である。
cmd="command1 | command2 | command3" eval "$cmd; STATUS=(\${PIPESTATUS[@]})" echo ${STATUS[@]}
2. サンプルコードと実行例
% expand -4 demo.sh #!/bin/bash exec_cmd() { local cmd="$1" test=${2:-0} local status=0 if [ $test = 1 ]; then echo $cmd else eval "$cmd; STATUS=(\${PIPESTATUS[@]})" echo "value of \${#STATUS[@]}: ${#STATUS[@]}" echo "value of \${STATUS[@]}: ${STATUS[@]}" status=${STATUS[0]} fi echo "status of 1st command: $status" return $status } log=`basename $0 .sh`.log exec_cmd "$1 2>&1 | tee $log" exit $?
% ./demo.sh echo\ aaa aaa value of ${#STATUS[@]}: 2 value of ${STATUS[@]}: 0 0 status of 1st command: 0 % echo $? 0
% ./demo.sh aaa ./demo.sh: line 10: aaa: command not found value of ${#STATUS[@]}: 2 value of ${STATUS[@]}: 127 0 status of 1st command: 127 % echo $? 127
3. 参考情報