Bashでエラーが発生した行番号を見つける方法は?
はい
私たちに必要なことを説明するために、行番号を含む次の簡単なスクリプトを作成しました。スクリプトは以下からファイルをコピーします。
cp $file1 $file2
cp $file3 $file4
cp
コマンドのいずれかが失敗すると、関数は終了します。1番出口。この関数にエラーや行番号(8または12など)を印刷する機能を追加したいと思います。
可能ですか?
サンプルスクリプト
1 #!/bin/bash
2
3
4 function in_case_fail {
5 [[ $1 -ne 0 ]] && echo "fail on $2" && exit 1
6 }
7
8 cp $file1 $file2
9 in_case_fail $? "cp $file1 $file2"
10
11
12 cp $file3 $file4
13 in_case_fail $? "cp $file3 $file4"
14
ベストアンサー1
機能を使用する代わりに、次の方法を使用します。
$ cat yael.bash
#!/bin/bash
set -eE -o functrace
file1=f1
file2=f2
file3=f3
file4=f4
failure() {
local lineno=$1
local msg=$2
echo "Failed at $lineno: $msg"
}
trap 'failure ${LINENO} "$BASH_COMMAND"' ERR
cp -- "$file1" "$file2"
cp -- "$file3" "$file4"
これはfailure()
、ERRをキャプチャし、現在行番号+実行されているbashコマンドを使用して関数を呼び出すことによって行われます。
はい
f1
ここでは、、f2
ファイル生成に気にしませf3
んでしたf4
。上記のスクリプトを実行すると:
$ ./yael.bash
cp: cannot stat ‘f1’: No such file or directory
Failed at 17: cp -- "$file1" "$file2"
失敗し、行番号と実行されたコマンドが報告されます。