Tüm değişken isimleri ve mevcut değerleri nasıl listelenir?


348

Tüm değişken isimleri ve mevcut değerleri nasıl listelenir?

Yalnızca $HOME, $PWDvb. Değil , tanımladığınız diğerlerini de dahil olmak üzere .



Yanlış bir cevap kabul ettin. "printenv" sadece çevre değişkenlerini verir. Kabuğunuzda şu anda bildirilen tüm değişkenleri gerçekten istiyorsanız, "declare -p" veya "typeset -p" kullanın.
Florin Andrei

Yanıtlar:


479

Bash için: (Ubuntu’daki standart kabuk)

Tüm ortam değişkenlerini yazdırmak için bir terminale aşağıdaki komutu girin:

printenv

Bu komut hakkında daha fazla bilgi için printenvman sayfasını okuyun .


"Kabuk değişkenleri" içeren bir liste göstermek için bir sonraki komutu girebilirsiniz:

( set -o posix ; set ) | less

Bu size sadece kabuk değişkenlerini değil, ortam değişkenlerini de gösterecektir .

Bu konuyla ilgili daha fazla bilgi için şunu okuyun:


Zsh için: (gelişmiş bir kabuk)

Aşağıdaki komutu kullanın:

( setopt posixbuiltin; set; ) | less

ZSH seçenekleri hakkında daha fazla bilgi için zshoptionsman sayfasına bakın .


14
Eğer terminale gidip yazıp MYNEWVARIABLE=Ubuntuçalıştırırsam printenvorada görünmüyor. Neden bu ve diğerleri nasıl ortaya çıkıyor?
Strapakowsky

4
Muhtemelen bir kabuk değişkeni ile bir ortam değişkeni arasındaki farkı görüyorsunuz. Deneyin export MYNEWVARIABLE=Ubuntuve beklediğiniz gibi çalışacak.
Rmano

3
Eğer sadece çalıştırırsanız set, sizin de yarattığınız değişkeni listeler. Veya yapınset | grep myvar
Sergiy Kolodyazhnyy

4
printenvharici bir komuttur, bu nedenle yalnızca dışa aktarılan çevre değişkenlerini bilir (ve yazdırır). setdahili bir bash komutudur, bu nedenle dışa aktarılan ortam değişkenlerinin yanı sıra tüm "kabuk değişkenlerini" (desteklenmeyen ortam değişkenleri) gösterir.
Dan Pritts

1
@ Rmano'nun @Strapakowsky'ye verdiği cevabı genişletmek için ... Bu işe yaramayacak unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW, ama bu olacak unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEWve bu olacak unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEW. Dışa aktarma kullanarak "Ayarladığım değişken, yalnızca bu kabuktaki bir değişken değil işlemlere iletilen ortamın bir parçası olmalıdır" diyor. Üçüncü örneğim, "değişken THIS işlemine geçen ortamın bir parçası olmalı, ancak daha sonra etrafta kalmamalı" diyor.
Bruno Bronosky

52

Bu sorunun oldukça eski ve cevaplanmış olduğunu biliyorum, ancak biraz yararlı bilgi ekleyebileceğimi düşünüyorum.

Yukarıda açıklanan tüm yöntemlerde, önerilen prosedür şudur:

  • terminal başlatmak
  • kullanarak ortam değişkenlerini envveya printenvveya

Bu çözümlerin sorunu terminale giren kabuğun çevre değişkenlerini görmenizdir . Bir uygulama çalışmasına uygun ortam değişkenlerini göremiyorsunuz, örneğin doğrudan grafik arayüzü ile.

Örneğin, ~/.profileya da .bashrc, ya da .zshenv(kabuğunuza bağlı olarak) ortam değişkenlerini değiştirmek için --- yolunuzu klasik dizin eklemesi gibi kullanıyorsanız, bu belirgindir .

Doğrudan grafik ortamında başlatılan uygulamaya uygun ortam değişkenlerini görmek için aşağıdakileri yapabilirsiniz (Gnome Shell'de, diğer tüm DE'de eşdeğer bir yöntem olduğundan eminim):

  • Alt-F2'ye basın
  • komutu çalıştır xterm -e bash --noprofile --norc

(Ya da yoksa xterm, gnome-terminal -- bash --noprofile --norc--- yorum için @Mike Nakis'e teşekkürler).

Artık ortam değişkenleri eklemeyen bir kabuğa sahip bir terminale sahipsiniz. envTüm ortam değişkenlerinizi listelemek için burayı kullanabilirsiniz :

Çıplak kabuk örneği

Açıkçası, yeni kabuk sistem dosyaları tarafından eklenen çevre değişkenlerine sahip olacak, ancak bu değişkenler yine de sistemdeki tüm programlarda kullanılabilir olmalıdır (kalıtım yoluyla).

Bunu gönderiyorum çünkü dördüncü kez bu numarayı tekrar aramak zorunda kalıyorum, dosyamı kontrol ediyorum .pam_environment. Şimdi onu daha hızlı bulacağım (ve bu süreçte başkalarına yardım etmeyi umuyorum ...)


Yalnızca CLI sunucusu için uygun olmayan bir masaüstü ortamınız olmasını gerektirir.
K7AAY

5
Evet --- fakat sonra CLI için sadece önceki cevap tamam. Sadece, grafiksel ortamın başlattığı uygulamaya uygun ortam değişkenlerini kontrol etmeniz gerektiğini, bunun içinde bir terminale başladığınızda gördüğünüz aynı set olmadığını sadece işaret ediyordum. Örneğin, Kile uygulamanızın bir LaTeX dosyasını neden derleyemediğini anlamaya çalışıyorsanız, bir terminalde iken, burada yayınlanan numaram çok yardımcı olacaktır.
Rmano

3
Çok yararlı bir cevap için teşekkür ederiz! Ben sadece help.ubuntu.com/community/… adresinden
Gunnar

Teşekkürler. xterm -e bash --noprofile --norcUbuntu grafik arayüzü ile başlatıldığında başlangıç ​​dosyaları okunmadığından ve çalıştırılmadığından tavsiye ettiniz mi? Bkz askubuntu.com/q/1025845/1471
Tim

1
Bugünlerde çalıştırmak için doğru komut (Ubuntu 18.04)gnome-terminal -- bash --noprofile --norc
Mike Nakis

45

declareYerleşik ile tüm değişkenleri görebilirsiniz .

declare -p

Yalnızca çevre değişkenleriyle ilgileniyorsanız,

declare -xp

Run help declarediğer seçenekleri nelerdir görmek için.


Bu kadar çok temiz-er çözümdür POSIXLY_CORRECT=1 setve aynı zamanda anılabilir declareolduğu aliasiçin (bu bağlamda) typesetbaşka bash yerleşiğini.

1
Bu doğru cevap.
Florin Andrei

12

İle terminalde ortam değişkenleri listelemek için CTRL+ ALT+ Tkullanabilirsiniz envkomutu.

Örneğin :

[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

vb.

umarım yardımcı olur.


Env'nin o_O değişkenlerini özlediğini fark ettim. Özellikle bir VAR = VAL dosyası oluşturduktan sonra.
ThorSummoner


7

Bileşen kullanarak bash:

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

2
Diğerleri sadece ismin kendisinden daha fazla listelediğinden, bu kabul edilen cevap olmalıdır. Benim durumumda bazı değişkenler, diğer çözümleri mümkün olmayan hale getiren çok satırlı değerler içerir.
Mene,

1
Bir değişken:compgen -v | while read line; do declare -p $line; done
Eljay

4

Buradaki çoğu çözüm, ya sadece ortam değişkenlerini yazdırır ya da env ya da (set -o posix; posix) değerleri ayrıştırılabilir biçimde yazdırmaz (A = $ 'a \ r \ nb' ... değişkeni basmayı deneyin). .

İşte POSIX çıkış biçiminde tüm değişkenleri satır başına bir değişken olacak şekilde yazdıracak bir işlev:

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

Compgen -v kullanımına dikkat çektiğiniz için @tmgoblin'e teşekkür ederiz.


1
Mükemmel ilk cevap! +1 İyi çalışmaya devam edin!
Fabby

3

env bir POSIX 7 yöntemidir :

export asdf=qwer
env | grep asdf

Örnek çıktı:

asdf=qwer

Dışa aktarılan değişkenleri gösterir: dışa aktarılmayan değişkenler genellikle "ortam değişkenleri" olarak kabul edilmez.

printenvPOSIX olmayanı tercih ediniz . Her ikisi de aynı şeyi argümanlar olmadan yapıyor gibi görünüyor: https://unix.stackexchange.com/questions/123473/what-is-the-difference-between-env-and-printenv


Zaten iki yıl önce bahsetti: askubuntu.com/a/276162/158442
muru

@muru yeterince adil. Keşke envdaha iyi biçimlendirme ile daha görünür olsaydı ve daha fazla bilgi ekledim.
Ciro Santilli,

Yani ne düzenleme içindir.
muru

2

Belirli bir ortam değişkeni istiyorsanız, hepsini yazdırmak yerine printenv, örneğin bunu yaparak yazdırabilirsiniz.echo "$PWD"


0

printenv yalnızca dışa aktarılan değişkenleri listeler, command+ alt+ $ ("\ e $": complete değişkeni) tüm değişkenleri listeler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.