在 Bash Shell 中使用 set

Niraj Menon 2023年1月30日
  1. 在 Bash 中使用 set -x 進行命令跟蹤
  2. Bash 中 set 的其他有用選項
在 Bash Shell 中使用 set

Bash shell 包含幾個有用的內建命令來操作當前執行的 shell 會話的環境。內建的 set 命令提供了檢視和更改 shell 環境變數和選項的能力。

本教程討論了 set 命令的使用範圍以及如何有效地編寫 Bash 指令碼來設定良好的環境選項。

在 Bash 中使用 set -x 進行命令跟蹤

預設情況下,單獨執行 set 命令將返回當前設定的變數及其值的列表,包括 Bash 可執行檔案位置、版本資訊和 PATH 等環境變數。

該命令的使用是當你檢視執行的命令時。如果你是程式設計師,這可以幫助你除錯 Bash 指令碼以檢視它們是否在特定命令上失敗。

為此,請執行 set -xset -o xtrace,這將開啟命令跟蹤。雖然命令本身不輸出任何內容,但後續命令將在執行前列印出來。在命令中使用大括號擴充套件(最近的 Bash 功能)很有幫助。

如果你有刪除編號 TXT 檔案的命令,啟用 set 命令跟蹤將顯示大括號的擴充套件形式以及該目錄中的所有 TXT 檔案。

user@linux:~$ set -x
user@linux:~$ cd /tmp
+ cd /tmp
user@linux:~$ # example of expansion (and comments do not print out in traces)
user@linux:~$ touch {1..5}.txt
+ touch 1.txt 2.txt 3.txt 4.txt 5.txt
user@linux:~$ rm -f *.txt
+ rm -f *.txt
user@linux:~$ # however, asterisk globs do not expand.

Bash 中 set 的其他有用選項

set 命令為類似於命令跟蹤的 shell 操作提供了許多其他互斥選項,例如不執行命令、將命令列更改為 Emacs 樣式的編輯器、發生錯誤時列印回溯等等。

請記住,要開啟一個選項,你必須使用 set -o <option_name>set +o <option_name> 將其關閉。

下面解釋了這些選項的完整列表,資訊來自 GNU manual for the set built-in

  1. allexport - 如果你有一個設定環境變數的 Bash 指令碼,並且你希望這些變數可用於當前 shell 和任何後續子 shell,set -aset -o allexport 會導致這些要匯出並可供這些 shell 上下文使用的變數。
  2. braceexpand - 大括號擴充套件允許我們將一對數字的常量集合擴充套件為這些數字範圍的空格分隔字串。如果你想在 shell 中使用較低的命令評估大括號,則關閉此選項將禁用大括號擴充套件。
  3. Emacs - 為熟悉它的人啟用基於 emacs 的命令列編輯。
  4. errexit - 如果 Bash 指令碼中的命令以非零狀態碼退出,則整個指令碼將停止。可以通過將失敗的命令與返回零退出程式碼的第二個命令進行 OR 運算來防止指令碼過早退出。
  5. errtrace - 如果程式以非零狀態碼退出,則會列印出對失敗命令的回溯。
  6. hashall - 在環境 PATH 中搜尋命令位置時跟蹤它們。它將命令路徑快取在一個位置,以便更快地搜尋和執行。
  7. histexpand - 擴充套件!字串中的字元作為歷史替換功能。如果你在使用!時遇到問題字串中的字元並且不做太多歷史替換工作,你可以安全地關閉它。
  8. 歷史 - 這是一項重要功能,可讓你維護以前執行的命令列表。
  9. ignoreeof - EOF 字元(由 Ctrl-D 提供)通常退出 Bash shell 或接受輸入的命令。禁用此選項會導致 EOF 被忽略,這可能會破壞一些只接受 EOF 的命令。
  10. Monitor - 啟用作業控制,使在後臺執行的程序在完成執行時列印出它們的退出程式碼。在後臺程序完成時檢查它們很有用。
  11. noclobber - 防止 Bash 重定向實用程式,例如 >&、<> 截斷現有檔案。如果你在測試時處理真實的日誌檔案並且不希望意外刪除現有日誌,這將非常方便。
  12. noexec - 列印出命令但不執行它們。如果在指令碼中使用,noexec 可以跳過某些命令並通過在某些點開啟和關閉它們來執行其他命令。
  13. noglob - 防止 glob 的擴充套件(即 *.txt)。
  14. Notify - 當與 monitor 一起使用時,notify 會立即列印出後臺作業狀態程式碼,而不是等待下一個 shell 提示。
  15. nounset - 如果未設定變數並嘗試讀取其值,則返回錯誤程式碼。
  16. onecmd - 讀取並執行下一條命令後退出。

如果你想閱讀更多選項,請參閱上面的手冊。希望這些選項可以改善你的 Bash 程式設計體驗。

如果你想從命令列再次瞭解這些選項,請嘗試執行 help set。我們還推薦 Linux 文件專案的頁面以獲取有關 set 命令的更多資訊。