回避策は次のとおりです。
$ comm -3 <(declare | sort) <(declare -f | sort)
壊す:
declare
定義済みのすべての変数(エクスポートされているかどうかに関係なく)および関数を出力します。
declare -f
関数のみを出力します。
comm -3
両方に共通するすべての行を削除します。実際には、これにより関数が削除され、変数のみが残ります。
エクスポートされない変数のみを印刷するには:
$ comm -3 <(comm -3 <(declare | sort) <(declare -f | sort)) <(env | sort)
別の回避策:
$ declare -p
これは変数のみを出力しますが、いくつかの見苦しい属性があります。
declare -- BASH="/bin/bash"
declare -ir BASHPID=""
declare -A BASH_ALIASES='()'
declare -a BASH_ARGC='()'
...
以下を使用して属性を切り取ることができます... cut:
$ declare -p | cut -d " " -f 3
1つの欠点は、IFSの値が表示される代わりに解釈されることです。
比較する:
$ comm -3 <(declare | sort) <(declare -f | sort)
...
IFS=$' \t\n'
...
$ declare -p | cut -d " " -f 3
...
IFS="
"
...
これは、その出力"
が1行であるため、その出力をさらに処理するために使用することを非常に困難にします。おそらく、これを防ぐためにIFS-fuをいくつか実行できます。
を使用したさらに別の回避策compgen
:
$ compgen -v
bashビルトインcompgen
は、補完スクリプトで使用することを目的としていました。このために、compgen -v
すべての定義済み変数をリストします。欠点:値ではなく変数名のみがリストされます。
値をリストするハックもあります。
$ compgen -v | while read var; do printf "%s=%q\n" "$var" "${!var}"; done
利点:それは純粋なbashソリューションです。欠点:を介した解釈のため、一部の値が台無しになりprintf
ます。また、パイプおよび/またはループからのサブシェルは、いくつかの余分な変数を追加します。