Bash

陷阱、ERR 和回顯錯誤行

  • April 4, 2022

我正在嘗試使用 Trap 創建一些錯誤報告,以針對所有錯誤呼叫函式:

Trap "_func" ERR

是否有可能得到 ERR 信號是從哪條線路發送的?外殼是 bash。

如果我這樣做,我可以閱讀並報告使用了什麼命令並記錄/執行一些操作。

或者也許我在這一切都錯了?

我測試了以下內容:

#!/bin/bash
trap "ECHO $LINENO" ERR

echo hello | grep "asdf"

並且$LINENO正在返回 2。不工作。

正如評論中指出的那樣,您的引用是錯誤的。您需要單引號以防止$LINENO在首次解析陷阱行時被擴展。

這有效:

#! /bin/bash

err_report() {
   echo "Error on line $1"
}

trap 'err_report $LINENO' ERR

echo hello | grep foo  # This is line number 9

執行它:

$ ./test.sh
Error on line 9

您還可以使用 bash 內置的“呼叫者”:

#!/bin/bash

err_report() {
 echo "errexit on line $(caller)" >&2
}

trap err_report ERR

echo hello | grep foo

它也列印文件名:

$ ./test.sh
errexit on line 9 ./test.sh

引用自:https://unix.stackexchange.com/questions/39623