如何列出目前 shell 的 Bash 選項?
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,最後一次+f
ilename 擴展再次啟用,也可能禁用。例如,如果第一次保存
-f
ilename 的值時已禁用擴展$-
,則其保存的值將是*(至少)*: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 subshell因為 subshell 是一個新程序並獲得自己的
trap
s 集 - 因此不繼承任何trap
s 但其父級明確忽略的那些 - (如trap '' INT
)。然而:
trap 'echo this is my trap' 0 save_traps=$(trap)
trap
當它是在命令替換子 shell 中執行的第一個也是唯一一個命令時,它的行為特別,因為它將重現父 shell 的目前設置的列表,traps
其格式為安全重新進入 shell 所引用的格式。所以你可以做save_traps
,然後set
沒有參數 - 以及所有已經提到的 - 幾乎可以鎖定所有 shell 狀態。不過,您可能希望顯式添加export -p
和readonly -p
恢復原始 shell var 屬性。無論如何,這就足夠了。