Bash
如何在bash中列出所有非環境變數?
我想
echo
在 Bash 3.2.52 中使用所有非環境變數(所有自我聲明的變數)。這個列印所有變數的命令給了我我無法理解的輸出,在我看來這與
set -x && clear -r
我已經工作的模式衝突。diff -U 1 <(set -o posix ; set |cut -d= -f1) <( exec bash -ic 'set -o posix ; set' | cut -d= -f1) | grep '^[-][^-]' | cut -d- -f2 | grep -vE '^(COLUMNS|HISTFILESIZE|HISTSIZE|LINES|PIPESTATUS)$'
我需要一個
echo
或printf
(或任何其他“更簡單”)操作來獲得這樣的列表。如果可能在此版本的 Bash 中,如何實現?
GNU 並行包括
env_parallel
. 部分env_parallel
列出了支持的 shell 的所有變數。對於
bash
此程式碼是:_names_of_VARIABLES() { compgen -A variable } _bodies_of_VARIABLES() { typeset -p "$@" }
因此,考慮到所有變數,我們需要弄清楚哪些變數是由使用者設置的。我們可以通過對給定版本設置的所有變數進行硬編碼來做到這一點
bash
,但這不會是未來的證明,因為bash
可能會在未來版本中設置更多變數($BASH_MYVAR
由使用者設置還是由未來版本設置bash
?)。所以改為
env_parallel
要求您定義一個乾淨的環境,並env_parallel --session
在其中執行。這將$PARALLEL_IGNORED_NAMES
通過列出之前定義的名稱來設置(使用上面的程式碼)。以後在使用者設置了變數的環境中執行時,很容易看出乾淨環境和目前環境的區別。
env_parallel --session
可以為每個會話定義一個乾淨的環境,但是如果您希望有一個可以跨會話使用的參考環境,只需將變數列表保存到文件中即可。所以:# In clean envronment compgen -A variable > ~/.clean-env-vars # In environment with user defined vars compgen -A variable | grep -Fxvf ~/.clean-env-vars
例如:
#!/bin/bash # In clean envronment compgen -A variable > ~/.clean-env-vars myvar=4 yourvar=3 # In environment with user defined vars compgen -A variable | grep -Fxvf ~/.clean-env-vars # This prints: # myvar # yourvar # PIPESTATUS (which is set when running a pipe)