Bagaimana cara membuat daftar semua nama variabel dan nilainya saat ini?

348

Bagaimana cara membuat daftar semua nama variabel dan nilainya saat ini?

Termasuk tidak hanya $HOME, $PWDdll tetapi yang lain yang telah Anda tetapkan.

Strapakowsky
sumber
3
superuser.com/questions/420295/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Anda menerima jawaban yang salah. "printenv" hanya memberi Anda variabel lingkungan. Jika Anda benar-benar ingin semua variabel saat ini dideklarasikan di shell Anda, gunakan "declare -p" atau "typeset -p".
Florin Andrei

Jawaban:

479

Untuk bash: (shell standar di Ubuntu)

Masukkan perintah berikut di terminal untuk mencetak semua variabel lingkungan:

printenv

Untuk informasi lebih lanjut tentang perintah ini, baca printenvhalaman manual .


Untuk menampilkan daftar termasuk "variabel shell" Anda dapat memasukkan perintah berikutnya:

( set -o posix ; set ) | less

Ini tidak hanya akan menunjukkan kepada Anda variabel shell, tetapi juga variabel lingkungan.

Untuk informasi lebih lanjut terkait dengan topik ini, baca:


Untuk zsh: (shell tingkat lanjut)

Gunakan perintah berikut:

( setopt posixbuiltin; set; ) | less

Untuk informasi lebih lanjut tentang opsi ZSH, lihat zshoptionshalaman manual .

Lucio
sumber
14
Jika saya pergi ke terminal dan menulis MYNEWVARIABLE=Ubuntudan menjalankannya printenvtidak muncul di sana. Mengapa begitu, dan bagaimana orang lain itu muncul?
Strapakowsky
4
Mungkin Anda melihat perbedaan antara variabel shell dan variabel lingkungan. Cobalah export MYNEWVARIABLE=Ubuntudan akan bekerja seperti yang Anda harapkan.
Rmano
3
jika Anda hanya menjalankan set, itu mencantumkan variabel yang dibuat oleh Anda juga. Atau lakukanset | grep myvar
Sergiy Kolodyazhnyy
4
printenvadalah perintah eksternal, jadi ia hanya tahu tentang (dan mencetak) variabel lingkungan yang diekspor. setadalah perintah bash internal, jadi itu menunjukkan semua "variabel shell" (variabel lingkungan yang tidak diekspor) serta variabel lingkungan yang diekspor.
Dan Pritts
1
Untuk memperluas pada @ Rmano, balasan ke @Strapakowsky ... Ini tidak akan berfungsi unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW, tapi ini akan unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW, dan ini akan unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEW. Menggunakan ekspor mengatakan "variabel yang saya setting harus menjadi bagian dari lingkungan yang diteruskan ke proses, bukan hanya variabel dalam shell ini." Contoh ketiga saya mengatakan "variabel harus menjadi bagian dari lingkungan yang diteruskan ke proses INI, tetapi tidak bertahan sesudahnya."
Bruno Bronosky
52

Saya tahu bahwa pertanyaan ini sudah cukup lama dan terjawab, tetapi saya pikir saya dapat menambahkan sedikit informasi yang berguna.

Dalam semua metode yang dijelaskan di atas, prosedur yang disarankan adalah:

  • luncurkan terminal
  • perlihatkan variabel lingkungan menggunakan env, atau printenvatau apa pun

Masalah dari solusi ini adalah bahwa Anda melihat variabel lingkungan dari shell yang berjalan ke terminal . Anda tidak melihat variabel lingkungan yang tersedia untuk menjalankan aplikasi, misalnya, langsung oleh antarmuka grafis.

Ini terlihat jika, misalnya, Anda menggunakan ~/.profile, atau .bashrc, atau .zshenv(tergantung pada shell Anda) untuk memodifikasi variabel lingkungan --- seperti penambahan klasik direktori ke path.

Untuk melihat variabel lingkungan yang tersedia untuk aplikasi yang dimulai langsung di lingkungan grafik, Anda dapat melakukan hal berikut (di Gnome Shell, saya yakin ada metode yang setara di semua DE lainnya):

  • tekan Alt-F2
  • jalankan perintah xterm -e bash --noprofile --norc

(Atau, jika Anda tidak punya xterm, gnome-terminal -- bash --noprofile --norc--- terima kasih kepada @ Mike Nakis untuk komentarnya).

Anda sekarang memiliki terminal dengan shell yang tidak menambahkan variabel lingkungan apa pun. Anda dapat menggunakan di envsini untuk mendaftar semua variabel lingkungan Anda:

Contoh kulit telanjang

Jelas shell baru akan memiliki variabel lingkungan yang ditambahkan oleh file sistem, tetapi variabel itu harus tersedia (berdasarkan warisan) untuk semua program dalam sistem.

Saya memposting ini karena ini keempat kalinya saya harus mencari trik ini lagi, memeriksa .pam_environmentfile saya . Jadi sekarang saya akan menemukannya lebih cepat (dan dalam prosesnya, saya harap membantu orang lain ...)

Rmano
sumber
Mengharuskan Anda memiliki lingkungan desktop, tidak berguna untuk server yang khusus CLI.
K7AAY
5
Ya --- tapi kemudian untuk CLI hanya jawaban sebelumnya yang ok. Saya baru saja menunjukkan bahwa kadang-kadang Anda perlu memeriksa variabel lingkungan yang tersedia untuk aplikasi dimulai oleh lingkungan grafis, yang tidak set yang sama yang Anda lihat ketika Anda memulai terminal di dalamnya. Misalnya, jika Anda mencoba memahami mengapa aplikasi Kile Anda tidak dapat mengkompilasi file LaTeX, sementara di terminal Anda bisa, trik yang saya posting di sini akan banyak membantu.
Rmano
3
Terima kasih atas jawaban yang sangat berguna! Saya baru saja menautkannya dari help.ubuntu.com/community/…
Gunnar Hjalmarsson
Terima kasih. Apakah Anda merekomendasikan xterm -e bash --noprofile --norckarena file startup tidak dibaca dan dieksekusi ketika Ubuntu dimulai dengan antarmuka grafis? Lihat askubuntu.com/q/1025845/1471
Tim
1
perintah yang tepat untuk dieksekusi saat ini (Ubuntu 18.04) adalahgnome-terminal -- bash --noprofile --norc
Mike Nakis
45

Anda dapat melihat semua variabel dengan declarebuiltin.

declare -p

Jika Anda hanya tertarik pada variabel lingkungan, gunakan

declare -xp

Jalankan help declareuntuk melihat apa opsi lainnya.

geirha
sumber
ini jauh solusi rapi-er daripada POSIXLY_CORRECT=1 setdan juga layak disebutkan bahwa declareadalah alias(dalam konteks itu) untuk typeset, builtin pesta lain.
1
Ini jawaban yang benar.
Florin Andrei
12

Untuk membuat daftar variabel lingkungan di terminal dengan CTRL+ ALT+ TAnda dapat menggunakan envperintah.

sebagai contoh :

[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

dll.

berharap itu bisa membantu.

rɑːdʒɑ
sumber
Saya perhatikan bahwa env melewatkan beberapa variabel o_O. khusus setelah sumber file VAR = VAL.
ThorSummoner
1
@ThorSummoner Jawabannya di sini mungkin membantu stackoverflow.com/questions/15474650/…
georaldc
7

Dalam bash menggunakan compgen:

compgen -v | while read line; do echo $line=${!line};done  
tmgoblin
sumber
2
Ini harus menjadi jawaban yang diterima, karena semua orang lain mendaftar lebih dari sekadar nama itu sendiri. Dalam kasus saya beberapa variabel berisi nilai multiline yang membuat solusi lain tidak dapat diterima.
Mene
1
Varian:compgen -v | while read line; do declare -p $line; done
Eljay
4

Sebagian besar solusi di sini hanya mencetak variabel lingkungan saja, atau memiliki kelemahan yang env atau (set -o posix; posix) tidak mencetak nilai dalam bentuk yang dapat diuraikan (cobalah untuk mencetak variabel A = $ 'a \ r \ nb' ...) .

Berikut adalah fungsi yang akan mencetak semua variabel, satu variabel per baris, dalam bentuk POSIX escaped:

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

Terima kasih kepada @tmgoblin untuk menunjukkan penggunaan compgen -v.

Ján Lalinský
sumber
1
Jawaban pertama yang bagus! +1 Terus bekerja dengan baik!
Fabby
3

env adalah cara POSIX 7 :

export asdf=qwer
env | grep asdf

Output sampel:

asdf=qwer

Ini hanya menunjukkan variabel yang diekspor: variabel yang tidak diekspor biasanya tidak dianggap "variabel lingkungan".

Lebih suka yang berakhir printenv, yang bukan POSIX. Keduanya tampaknya melakukan hal yang sama tanpa argumen: https://unix.stackexchange.com/questions/123473/what-is-the-difference-between-env-and-printenv

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
Sudah disebutkan dua tahun lalu: askubuntu.com/a/276162/158442
muru
@uru cukup adil. Berharap itu menjadi envlebih terlihat dengan pemformatan yang lebih baik, dan saya telah menambahkan lebih banyak info.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Untuk itulah pengeditan .
muru
2

Jika Anda menginginkan variabel lingkungan tertentu, daripada mencetak semuanya printenv, Anda dapat, misalnya, mencetak dengan melakukanecho "$PWD"

inigo333
sumber
0

printenv hanya mencantumkan variabel yang diekspor, command+ alt+ $ ("\ e $": variabel lengkap) akan mencantumkan semua variabel.

pengguna1133275
sumber