Bash

如何列出目前 shell 的 Bash 選項?

  • October 15, 2021

Bash 解釋器本身有選項。

例如,在Bash 手冊頁的第22-23 行中提到的那些:

選項

set 內置命令的描述中記錄的所有單字元 shell 選項都可以在呼叫 shell 時用作選項。此外,bash 在呼叫時解釋以下選項:

-c …

-i …

-l …

-r …

我在 Bash 的手冊頁中使用了一些搜尋模式,例如:

  • /^\s*set
  • /list

是否可以列印應用於目前 shell 的這些設置的列表?

printf %s\\n "$-"

將在單個字元串中列出單個字母選項。

該參數也可以像這樣使用:

set -f -- ${-:+"-$-"}
echo *don\'t* *glob* *this*
set +f "$@"

首先禁用 shell-f文件名擴展,同時保存一個值$-- 如果有的話 - in $1。接下來,不會發生 glob,最後一次+filename 擴展再次啟用,也可能禁用。

例如,如果第一次保存-filename 的值時已禁用擴展$-,則其保存的值將是*(至少)*:

f

因此,當set再次執行時,它可以:

set +f -f

這只是讓你回到你開始的地方。

set +o

將以對shell 重新進入安全的形式列出所有set表 shell 選項*(請參閱Jason 的答案shopt- 這是一個詞嗎? - 選項) 。*這樣,您還可以執行以下操作:

state=$(set +o)
set -some -crazy -options
eval "$state"

分別保存、更改和恢復 shell 選項的狀態。

一次性處理shopt離子和set表選項:

state=$(set +o;shopt)
#do what you want with options here
eval "$state"

您也可以在set 不帶任何參數的情況下呼叫以添加所有 shell 目前設置的變數的列表 - 也引用以重新進入 shell。您可以在 bash 中另外添加命令typeset -fp以包括所有目前聲明的 shell 函式。你可以把它們放在一起,eval準備好後。您甚至可以在alias沒有參數的情況下呼叫更多相同的內容。不過,那…可能會涵蓋它。我想有"$@"- 我想你必須先把它放在一個bash數組中,然後再做set.

不,還有trap。這個有點搞笑。通常:

trap 'echo this is my trap' 0
(echo this is my subshell; trap)

…將僅列印this is my subshel​​l因為 subshel​​l 是一個新程序並獲得自己的traps 集 - 因此不繼承任何traps 但其父級明確忽略的那些 - (如trap '' INT)

然而:

trap 'echo this is my trap' 0
save_traps=$(trap)

trap當它是在命令替換子 shell 中執行的第一個也是唯一一個命令時,它的行為特別,因為它將重現父 shell 的目前設置的列表,traps其格式為安全重新進入 shell 所引用的格式。所以你可以做save_traps,然後 set沒有參數 - 以及所有已經提到的 - 幾乎可以鎖定所有 shell 狀態。不過,您可能希望顯式添加export -preadonly -p恢復原始 shell var 屬性。

無論如何,這就足夠了。

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