Tüm değişken isimleri ve mevcut değerleri nasıl listelenir?
Yalnızca $HOME
, $PWD
vb. Değil , tanımladığınız diğerlerini de dahil olmak üzere .
Tüm değişken isimleri ve mevcut değerleri nasıl listelenir?
Yalnızca $HOME
, $PWD
vb. Değil , tanımladığınız diğerlerini de dahil olmak üzere .
Yanıtlar:
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 printenv
man 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 zshoptions
man sayfasına bakın .
MYNEWVARIABLE=Ubuntu
çalıştırırsam printenv
orada görünmüyor. Neden bu ve diğerleri nasıl ortaya çıkıyor?
export MYNEWVARIABLE=Ubuntu
ve beklediğiniz gibi çalışacak.
set
, sizin de yarattığınız değişkeni listeler. Veya yapınset | grep myvar
printenv
harici bir komuttur, bu nedenle yalnızca dışa aktarılan çevre değişkenlerini bilir (ve yazdırır). set
dahili 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.
unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW
, ama bu olacak unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW
ve 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.
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:
env
veya
printenv
veyaBu çö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, ~/.profile
ya 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):
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. env
Tüm ortam değişkenlerinizi listelemek için burayı kullanabilirsiniz :
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 ...)
xterm -e bash --noprofile --norc
Ubuntu 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
gnome-terminal -- bash --noprofile --norc
declare
Yerleşik ile tüm değişkenleri görebilirsiniz .
declare -p
Yalnızca çevre değişkenleriyle ilgileniyorsanız,
declare -xp
Run help declare
diğer seçenekleri nelerdir görmek için.
POSIXLY_CORRECT=1 set
ve aynı zamanda anılabilir declare
olduğu alias
için (bu bağlamda) typeset
başka bash yerleşiğini.
İle terminalde ortam değişkenleri listelemek için CTRL+ ALT+ Tkullanabilirsiniz env
komutu.
Ö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.
Bileşen kullanarak bash:
compgen -v | while read line; do echo $line=${!line};done
compgen -v | while read line; do declare -p $line; done
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.
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.
printenv
POSIX 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
env
daha iyi biçimlendirme ile daha görünür olsaydı ve daha fazla bilgi ekledim.
printenv yalnızca dışa aktarılan değişkenleri listeler, command+ alt+ $ ("\ e $": complete değişkeni) tüm değişkenleri listeler.