すべての変数名とその現在の値をリストする方法は?


348

すべての変数名とその現在の値をリストする方法は?

$HOME$PWDなどだけでなく、定義した他のものも含めます。



間違った答えを受け入れました。「printenv」は環境変数のみを提供します。シェルで現在宣言されているすべての変数が本当に必要な場合は、「declare -p」または「typeset -p」を使用します。
フローリン・アンドレイ

回答:


479

bashの場合:(Ubuntuの標準シェル)

ターミナルで次のコマンドを入力して、すべての環境変数を印刷します。

printenv

このコマンドの詳細については、printenvマニュアルページを参照してください


「シェル変数」を含むリストを表示するには、次のコマンドを入力できます。

( set -o posix ; set ) | less

これにより、シェル変数だけでなく、環境変数も表示されます。

このトピックに関連する詳細については、次を参照してください。


zshの場合:(高度なシェル)

次のコマンドを使用します。

( setopt posixbuiltin; set; ) | less

ZSHオプションの詳細については、zshoptionsmanページを参照してください


14
ターミナルに行って書いMYNEWVARIABLE=Ubuntuて実行するprintenvと、そこには表示されません。それはなぜですか?
ストラパコフスキー

4
おそらく、シェル変数と環境変数の違いを見ています。試してみてexport MYNEWVARIABLE=Ubuntu、期待どおりに動作します。
Rmano

3
単に実行するとset、作成された変数もリストされます。または実行set | grep myvar
Sergiy Kolodyazhnyy

4
printenvは外部コマンドであるため、エクスポートされた環境変数のみを認識(および出力)します。 setは内部bashコマンドであるため、すべての「シェル変数」(エクスポートされていない環境変数)とエクスポートされた環境変数を表示します。
ダンプリッツ

1
@Rmanoの@Strapakowskyへの返信を拡張するには...これは機能しませんunset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEWが、これは機能しunset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW、これは機能しunset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEWます。exportを使用すると、「設定している変数は、このシェルの変数だけでなく、プロセスに渡される環境の一部である必要があります」と表示されます。3番目の例では、「変数は、このプロセスに渡される環境の一部である必要がありますが、その後は使用しないでください。」
ブルーノブロノスキー16

52

私はこの質問がかなり古くて答えられていることを知っていますが、少し役に立つ情報を追加できると思います。

上記のすべての方法で、推奨される手順は次のとおりです。

  • ターミナルを起動する
  • env、または printenvその他を使用して環境変数を表示する

これらのソリューションの問題は、ターミナルを実行しているシェルの環境変数が表示されることです。たとえば、グラフィックインターフェイスから直接実行されるアプリケーションで使用できる環境変数は表示されません。

これは、たとえば、、~/.profileまたは.bashrc、または.zshenv(シェルに応じて)を使用して環境変数を変更する場合に顕著です。これは、パスへのディレクトリの古典的な追加のように。

グラフィック環境で直接起動されたアプリケーションで使用可能な環境変数を確認するには、次の操作を実行できます(Gnomeシェルでは、他のすべてのDEに同等のメソッドがあると確信しています)。

  • Alt-F2を押す
  • コマンドを実行する xterm -e bash --noprofile --norc

(または、お持ちでない場合はxtermgnome-terminal -- bash --noprofile --norc--- @Mike Nakisのコメントに感謝します)。

これで、環境変数を追加しなかったシェルを備えた端末ができました。envここを使用して、すべての環境変数をリストできます。

裸のシェルの例

明らかに、新しいシェルにはシステムファイルによって環境変数が追加されますが、その変数は(継承によって)システム内のすべてのプログラムで利用できるはずです。

.pam_environmentファイルをチェックしてこのトリックをもう一度検索する必要があるのは4回目だからです。だから今、私はそれをより速く見つけるでしょう(そしてその過程で、私は他の誰かを助けることを望みます...)


デスクトップ環境が必要です。サーバーCLI専用のユーザーには役立ちません。
K7AAY

5
はい---しかし、CLIの場合は前の答えだけで大丈夫です。グラフィカル環境で起動されたアプリケーションで利用可能な環境変数を確認する必要があることを指摘していましたが、これはターミナルを起動したときに表示されるものとは異なります。たとえば、KileアプリがLaTeXファイルをコンパイルできない理由を理解しようとしているのに、ターミナルではできますが、ここに投稿したトリックは大いに役立ちます。
Rmano

3
非常に役立つ答えをありがとう!help.ubuntu.com/community/
17:06

ありがとう。xterm -e bash --noprofile --norcUbuntuがグラフィカルインターフェイスで起動されたときに起動ファイルが読み取られて実行されないため、お勧めしましたか?参照してくださいaskubuntu.com/q/1025845/1471
ティム・

1
最近実行する正しいコマンド(Ubuntu 18.04)はgnome-terminal -- bash --noprofile --norc
Mike Nakis

45

declare組み込みのすべての変数を見ることができます。

declare -p

環境変数のみに関心がある場合は、使用します

declare -xp

実行help declareして、他のオプションを確認します。


これは、これまでよりもきちんと-ERのソリューションでPOSIXLY_CORRECT=1 setあり、それはまた、特筆すべきでdeclareあるaliasために(そのコンテキストで)typeset別のbashの組み込み、。

1
これは正解です。
フローリン・アンドレイ

12

ターミナルの環境変数をCTRL+ ALT+ でリストするには、コマンドTを使用できますenv

例えば ​​:

[raja@localhost ~]$ env
XDG_VTNR=1
SSH_AGENT_PID=3671
XDG_SESSION_ID=3
HOSTNAME=localhost.localdomain
IMSETTINGS_INTEGRATE_DESKTOP=yes
GPG_AGENT_INFO=/home/raja/.gnupg/S.gpg-agent:3691:1
GLADE_PIXMAP_PATH=:
TERM=xterm-256color
SHELL=/bin/bash
XDG_MENU_PREFIX=xfce-
DESKTOP_STARTUP_ID=
HISTSIZE=1000
XDG_SESSION_COOKIE=0250277dd805498381e96c05d88068b0-1364679772.845276-1676152201
WINDOWID=65011716
GNOME_KEYRING_CONTROL=/home/raja/.cache/keyring-N3QoQ2
IMSETTINGS_MODULE=none
QT_GRAPHICSSYSTEM_CHECKED=1
USER=raja

それが役立つことを願っています。


envがいくつかの変数o_Oを見逃していることに気付きました。具体的には、VAR = VALファイルを取得した後。
ThorSummoner

1
@ThorSummonerここでの答えは、stackoverflow.com
questions / 15474650 /…に

7

compgenを使用したbashの場合:

compgen -v | while read line; do echo $line=${!line};done  

2
他のすべての人が名前だけでなくそれ以上をリストしているので、これは受け入れられた答えでなければなりません。私の場合、いくつかの変数には複数行の値が含まれているため、他のソリューションは実行できません。
メネ

1
バリエーション:compgen -v | while read line; do declare -p $line; done
エルジェイ

4

ここでのほとんどのソリューションは、環境変数のみを印刷するか、envまたは(set -o posix; posix)が解析可能な形式で値を印刷しないという欠点があります(変数A = $ 'a \ r \ nb' ...を印刷してみてください) 。

以下に、POSIXエスケープ形式ですべての変数を1行に1変数ずつ出力する関数を示します。

function dump_vars {
    local VARNAME
    compgen -v | while read -r VARNAME; do
        printf "$VARNAME=%q\n" "${!VARNAME}"
    done
}

compgen -vの使用を指摘してくれた@tmgoblinに感謝します。


1
素晴らしい最初の答え! +1 良い仕事を
ファビー

3

envPOSIX 7の方法です:

export asdf=qwer
env | grep asdf

サンプル出力:

asdf=qwer

エクスポートされた変数のみが表示されます。エクスポートされていない変数は、通常「環境変数」とは見なされません。

上のことを好むprintenv、POSIXされていません。どちらも引数なしで同じことをしているようです:https : //unix.stackexchange.com/questions/123473/what-is-the-difference-between-env-and-printenv


すでに2年前に言及:askubuntu.com/a/276162/158442
muru

@muruまあまあ。envより良い書式設定でもっと見やすくしたいので、もっと情報を追加しました。
Ciro Santilli新疆改造中心法轮功六四事件

それが編集の目的です。
ムル

2

すべてをprintenvで印刷するのではなく、特定の環境変数が必要な場合は、たとえば次のようにして印刷できます。echo "$PWD"


0

printenvはエクスポートされた変数のみをリストし、 command+ alt+ $ ( "\ e $":complete-variable)はすべての変数をリストします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.