3

複数行の値を持つ環境変数は、envの出力を混乱させる可能性があります。

# export A="B
> C=D
> E=F"
# env
A=B
C=D
E=F
TERM=xterm
SHELL=/bin/bash
USER=root
MAIL=/var/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/root
LANG=en_US.UTF-8
PS1=\h:\w\$
SHLVL=1
HOME=/root
LOGNAME=root
_=/usr/bin/env

この場合、間違った名前が表示されるため、すべての名前を抽出するために使用することはできませんawk -F=CE

# env | awk -F= '{print $1}'
A
C
E
TERM
SHELL
USER
MAIL
PATH
PWD
LANG
PS1
SHLVL
HOME
LOGNAME
_

次に、各出力行を改行ではなく 0 バイトで終了envするフラグをサポートしていることがわかったので、使用すると、次の値を切り捨てることができます。-0sedbash

# env -0 | sed -e ':a;N;$!ba;s/\([^=]\+\)=\([^\x00]*\)\x00/\1\n/g'
A
TERM
SHELL
USER
MAIL
PATH
PWD
LANG
PS1
SHLVL
HOME
LOGNAME
_

ただし、 BusyBox のバージョンのはflagenv をサポートしていません-0。それを行う別の方法はありますか?

4

3 に答える 3

4

Linux を使用している場合 (busybox は Linux でしか動作しないと思っていましたが、間違っている可能性があります) には、提供/proc/self/environされているものと同じ形式の NUL 分離環境が含まれていenv -0ます。env -0 |と交換できます< /proc/self/environ

sed -e ':a;N;$!ba;s/\([^=]\+\)=\([^\x00]*\)\x00/\1\n/g' < /proc/self/environ
于 2012-06-23T03:50:56.570 に答える
2

これはおそらくエレガントではありませんが、実用的なソリューションです。最初に の出力からすべての可能な名前を抽出しenv、次にシェルの展開を使用してそれぞれを検証します${parameter:+word}。そして最後に、同じ変数名が の出力の複数の行に表示される可能性があるためenv(実際の変数名として、および他の変数の複数行の値の一部として)、重複を削除します。

env | awk -F= '/[a-zA-Z_][a-zA-Z_0-9]*=/ {
        if (!system("[ -n \"${" $1 "+y}\" ]")) print $1 }' | sort | uniq

PS: この| sort | uniqパーツは にも実装できますawk

于 2012-06-23T03:08:22.763 に答える