Closed6

シェル変数の一覧を見るワンライナーを作る

suzuki-navisuzuki-navi

環境変数の一覧を見るには printenv コマンドがある。これにはシェルの変数が含まれない。

シェルの変数も含めて一覧を見るには set コマンドがある。これの変数名だけを取得したい。

suzuki-navisuzuki-navi
$ set

set コマンドを実行すると、以下は抜粋だがこのように表示される。

HOME=/home/ec2-user
HOST_GID=1000
HOST_UID=1000
HOST_USER=ec2-user
LANG=en_US.UTF-8
LESSCHARSET=UTF-8
suzuki-navisuzuki-navi

各行で先頭の = までを抜き出す処理を入れてみる。

$ set | sed -E -e 's/^(.+?)=.*$/\1/g'
HOME
HOST_GID
HOST_UID
HOST_USER
LANG
LESSCHARSET

set の出力を見るとたまに = がない変数名だけのものがあるが、それはそのまま出力される。

suzuki-navisuzuki-navi

一見うまくいってそうだが、以下のような行があった。

LS_COLORS='rs=0:di=01;34:...

値自体に = があるとダメの様子。

最短一致の量指定子 .+? が最短一致になっていない気がする。

sedには最短一致ができないようなので、こうする。 (.+?)(^=+) にしている。

$ set | sed -E -e 's/^([^=]+)=.*$/\1/g'
suzuki-navisuzuki-navi

出力結果の先頭のほうは、記号が含まれていてシングルクオートで囲まれる。

'!'
'#'
'$'
'*'
-
0
'?'
@
ARGC
CDPATH
suzuki-navisuzuki-navi

zshで作業していての動作確認だったので、bashでも同じコマンドを試してみた。

記号が含まれていてシングルクオートで囲まれるものは、bashでは出力されない。

結論

$ set | sed -E -e 's/^([^=]+)=.*$/\1/g'
このスクラップは2023/07/08にクローズされました