posix shell:環境変数名のリストを印刷する(値なし)

posix shell:環境変数名のリストを印刷する(値なし)

複数の実装と互換性のある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$

envorなどの他のオプションには、printenv値なしで変数名のみを印刷するオプションはありません。少なくとも私が試したLinuxとfreebsdプラットフォームではそうではありません。

パイプを介してawk/sed/etcに接続します。または、パラメータ拡張技術(例:)を使用してリストをトリミングすることは許可されていますが、行にまたがって値にスペースを含めることができる値を処理する必要があります${foo%%=*}(上記の例を参照)。=

特定のシェル実装に関連する答えは興味深いですが、主に実装間の互換性を探しています。

ベストアンサー1

awkではこれはとても簡単です。

awk 'BEGIN{for(v in ENVIRON) print v}'

ただし、一部のawk実装は独自の環境変数を追加することに注意してください(例:GNU awk addAWKPATHAWKLIBPATHto 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

おすすめ記事