複数の実装と互換性のあるposix互換の方法で現在定義されている環境変数のリストを印刷する方法いいえ彼らの価値は?
いくつかの実装(mksh、freebsd /bin/sh)では、それexport
自体を使用すれば十分です。
$ export
FOO2
FOO
ただし、他のいくつかの実装(bash、zsh、dash)の場合export
でもこの値が表示されます。 Bashを例に挙げてみましょう。
$ export
export FOO2='as df\
asdk=fja:\
asd=fa\
asdf'
export FOO='sjfkasjfd kjasdf:\
asdkj=fkajdsf:\
:askjfkajsf=asdfkj:\
safdkj'
$ printenv | sed -n l
FOO2=as\tdf\$
asdk=fja:\$
asd=fa\$
asdf$
FOO=sjfkasjfd kjasdf:\$
asdkj=fkajdsf:\$
\t:askjfkajsf=asdfkj:\$
safdkj$
env
orなどの他のオプションには、printenv
値なしで変数名のみを印刷するオプションはありません。少なくとも私が試したLinuxとfreebsdプラットフォームではそうではありません。
パイプを介してawk/sed/etcに接続します。または、パラメータ拡張技術(例:)を使用してリストをトリミングすることは許可されていますが、行にまたがって値にスペースを含めることができる値を処理する必要があります${foo%%=*}
(上記の例を参照)。=
特定のシェル実装に関連する答えは興味深いですが、主に実装間の互換性を探しています。
ベストアンサー1
awkではこれはとても簡単です。
awk 'BEGIN{for(v in ENVIRON) print v}'
ただし、一部のawk実装は独自の環境変数を追加することに注意してください(例:GNU awk addAWKPATH
とAWKLIBPATH
to ENVIRON
)。
環境変数名に改行文字が含まれている場合、出力はあいまいになります。これは非常にまれですが、技術的に可能です。純粋なshソリューションは難しいでしょう。最良の方法は始めることですが、export -p
純粋なshでマッサージするのは難しいです。 sedを使用して出力を処理export -p
し、sedを使用してeval
参照する内容を削除するようにシェルに指示できます。 Bashとzshは非標準のプレフィックスを印刷します。
report () { echo "${1%%=*}"; };
eval "$(export -p | sed "s/^export /report /;
s/^declare -x /report /;
s/typeset -x /report /")"
シェルによっては、export -p
名前がシェルに無効な変数が表示されたり、表示されないことがあります。そうしないと、名前が正しく引用されたり引用されたりしない場合があります。たとえば、dash、mksh、およびzshは名前に改行文字を含む変数を省略し、BusyBox dashとksh93 rawはそれらを印刷し、bash rawはその値を含まずに印刷します。信頼できない入力を守る必要がある場合は、純粋なPOSIXソリューションeval
に頼らないでくださいexport -p
。