エラートラップに関して理解したい質問がいくつかあります。
関数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 ]
関数FuncAの終了ステータスがゼロ以外であるため、ERRトラップが実行されたようです。 man bash
に記載されているとおり
関数の終了ステータスは、本体で最後に実行されたコマンドの終了ステータスです。
この場合、これは[[ -d mydir2 ]]
でした。関数の最後のコマンドとしてtrue
を追加して、それを防ぐことができます。
if
構造は異なります。理由は、(同じマニュアル):
終了ステータスは、最後に実行されたコマンドの終了ステータスです。真の条件がテストされていない場合はゼロです。
if
を追加するのではなく、true
を使用することをお勧めします。