エラートラップについていくつかの質問があります。
- 以下のコードはなぜ2つではなく1つのトラップしか実行しないのですか?特に、「mydir1」の代わりに「mydir2」を持つコードのみを実行しますか?
- 一体なぜトラップをするのですか?
- コマンドがタグ付きコードで書かれていると、トラップがまったく生成されないのはなぜですか?
- このコードを書くための最良/正しい方法は何ですか?
FuncA関数の行番号ではなく、エラーコマンドの正しい行番号を取得する理由と方法は何ですか?
#!/bin/bash set -o errtrace trap 'printerr' ERR function printerr(){ local lc="$BASH_COMMAND" rc=$? ln=${BASH_LINENO[$i]} echo "$(date +%s) : Command [ $lc ] exited with code [ $rc ] in line [ $ln ]" } function FuncA(){ [[ -d mydir1 ]] && echo mydir1OK [[ -d mydir2 ]] && echo mydir2OK #if [ -d /mtdir/ ] ;then # echo OKMYDIR #fi } FuncA
結果:
1457453672 : Command [ [[ -d mydir2 ]] ] exited with code [ 1 ] in line [ 13 ]
ベストアンサー1
FuncA関数の終了ステータスが0ではないため、ERRトラップが実行されたようです。に記録されているようにman bash
関数の終了状態は、関数本体内で実行された最後のコマンドの終了状態です。
この場合、yes関数の最後のコマンドとしてaを追加することで回避[[ -d mydir2 ]]
できます。true
(同一マニュアル) 以下の理由で構造if
が異なります。
終了ステータスは、最後に実行されたコマンドのステータス、またはtrueでテストされる条件がない場合は0です。
if
追加ではなく使用をお勧めしますtrue
。