Bashで環境以外のすべての変数を一覧表示するには?

Bashで環境以外のすべての変数を一覧表示するには?

echoBash 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で可能であれば、どのように達成できますか?

ベストアンサー1

GNU Parallel Includeenv_parallelセクションには、env_parallelサポートされているシェルのすべての変数がリストされています。

このコードの場合はbash次のようになります。

_names_of_VARIABLES() {
    compgen -A variable
}
_bodies_of_VARIABLES() {
    typeset -p "$@"
}

したがって、すべての変数が与えられたら、ユーザーがどの変数を設定したかを調べる必要があります。私たちできるこれは特定のバージョンのすべての変数をハードコードすることによって行われますが、将来のバージョン(ユーザーまたは将来のバージョン?)でより多くの変数が設定される可能性があるため、bashこれは将来の証拠ではありません。bash$BASH_MYVARbash

したがって、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)

おすすめ記事