web-dev-qa-db-ja.com

bashスクリプトのトラップエラー

エラートラップに関して理解したい質問がいくつかあります。

  1. 以下のコードが2つではなく1つのトラップのみを実行し、具体的には「mydir1」ではなく「mydir2」を含むコードのみを実行するのはなぜですか?
  2. なぜトラップを実行しているのですか?
  3. コマンドがマークされたコードとして記述されている場合、トラップがまったく生成されないのはなぜですか。
  4. このコードを書くための最良の/適切な方法は何ですか。
  5. 関数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
Asaf Magen

関数FuncAの終了ステータスがゼロ以外であるため、ERRトラップが実行されたようです。 man bashに記載されているとおり

関数の終了ステータスは、本体で最後に実行されたコマンドの終了ステータスです。

この場合、これは[[ -d mydir2 ]]でした。関数の最後のコマンドとしてtrueを追加して、それを防ぐことができます。

if構造は異なります。理由は、(同じマニュアル):

終了ステータスは、最後に実行されたコマンドの終了ステータスです。真の条件がテストされていない場合はゼロです。

ifを追加するのではなく、trueを使用することをお勧めします。

1
choroba