Bashでエラーが発生した場合、行番号をどのように検索しますか?

Bashでエラーが発生した場合、行番号をどのように検索しますか?

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"

失敗し、行番号と実行されたコマンドが報告されます。

おすすめ記事