Bash

如何在bash中列出所有非環境變數?

  • November 16, 2019

我想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)$'

我需要一個echoprintf(或任何其他“更簡單”)操作來獲得這樣的列表。

如果可能在此版本的 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)

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