環境以外の変数をすべて印刷するには?
以下は、シェルから起動した後に次の操作を行ったときに直接追加したすべての変数です。
read abc
123
# echo ${abc} => 123
または
xyz='123'
# echo ${xyz} => 123
メモリに追加された内容を理解して消去できるように、これらすべてを印刷したいと思います。
ベストアンサー1
Bashを使用している場合、このコマンドは子プロセスから継承されず、基本リストの一部ではないすべてのシェル変数の名前を一覧表示します。
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)$'
これにより、現在のシェルのすべての変数名のリストが生成されます(ここでset
)と同じシェルを実行している新しく作成されたサブプロセスのすべての変数名のリストを使用して、最初のリストのすべての変数名を見つけ、2番目のリストの変数名を検索しません(次を使用)。diff
、最後のカットと最初のgrep)、ユーザーターゲットシェルではないため、サブプロセスに含まれていないいくつかのBash関連のデフォルト変数を削除します。変数のみがset -o posix
リストされset
、関数はリストされません。
省略します両方継承された環境変数およびエクスポートされたと明示的に表示された変数。
bash
シェルを変更してください。また、最後に無視された変数のリストを変更する必要があり、そのgrep
場合、その変数が失われる可能性がありますset -o posix
。シェルにない場合プロセスの交換、代わりに一時ファイルを使用するか、ファイル記述子へのプラットフォーム固有のアクセス(たとえば/dev/fd
。
一方、自分のローカル変数と関数を消去したい場合は、次のようにします。
exec bash
これはこれらの効果を引き起こします(一部の設定ファイルを再読み込みすると、シェルオプションへのローカル変更が失われる可能性があります)。