結果:

結果:

エラートラップについていくつかの質問があります。

  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

FuncA関数の終了ステータスが0ではないため、ERRトラップが実行されたようです。に記録されているようにman bash

関数の終了状態は、関数本体内で実行された最後のコマンドの終了状態です。

この場合、yes関数の最後のコマンドとしてaを追加することで回避[[ -d mydir2 ]]できます。true

(同一マニュアル) 以下の理由で構造ifが異なります。

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

if追加ではなく使用をお勧めしますtrue

おすすめ記事