Bagaimana cara menunjukkan nilai saat ini dari variabel lingkungan?

24

Ketika saya memeriksa lingkungan sistem saya, banyak variabel lingkungan akan muncul. Bagaimana saya bisa mencari variabel tertentu?

Sebuah buku yang saya baca mengatakan:

Terkadang jumlah variabel di lingkungan Anda tumbuh cukup besar, sedemikian rupa sehingga Anda tidak ingin melihat semua nilai yang ditampilkan ketika Anda tertarik hanya satu. Jika demikian, Anda dapat menggunakan echoperintah untuk menunjukkan nilai variabel lingkungan saat ini.

Bagaimana saya melakukan ini di terminal Linux?

iLearnSlow
sumber

Jawaban:

25

Hanya:

echo "$VARIABLENAME"

Misalnya untuk variabel lingkungan $HOME, gunakan:

echo "$HOME"

Yang kemudian mencetak sesuatu yang mirip dengan:

/home/username

Sunting : sesuai dengan komentar Stéphane Chazelas , mungkin lebih baik jika Anda menggunakan printenvdaripada echo:

printenv HOME
kekacauan
sumber
4
Anda lupa tanda kutip (kecuali jika Anda menyiratkan sintaks zsh atau rc / es). echoadalah pilihan perintah yang buruk karena dapat mengubah konten variabel. Ini akan menampilkan konten dari parameter shell dengan nama yang sama. Itu tidak selalu sama jika menggunakan shell Bourne atau untuk env vars seperti 1, *misalnya. Dan Anda tidak dapat menggunakan pendekatan itu untuk env vars yang namanya tidak valid sebagai nama variabel shell.
Stéphane Chazelas
5
Juga perhatikan bahwa jika ada beberapa entri lingkungan dengan nama yang sama (OK, kasus patologis), yang mana yang akan Anda dapatkan tergantung pada shell (biasanya yang pertama atau yang terakhir). printenv VARakan menampilkan semuanya (setidaknya untuk implementasi GNU).
Stéphane Chazelas
9

Dengan mengeksekusi:

printenv

Anda akan melihat semua variabel lingkungan. Untuk info lebih lanjut, Anda dapat melihat di:

https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-a-linlinux-vps

Svetlin Tonchev
sumber
2
Untuk mendekati benar-benar menjawab pertanyaan, printenv variablenamehanya akan menampilkan variabel bernama; misalnya, printenv  HOMEakan melakukan hal yang kira - kira sama dengan echo  "$HOME".
G-Man Mengatakan 'Reinstate Monica'
5

Penting untuk dipahami bahwa setiap proses memiliki variabel lingkungannya sendiri.

Ketika suatu proses panggilan fork()sistem panggilan, proses kedua ( anak ) identik dengan yang pertama ( induk ) dibuat ( salinan ini termasuk lingkungan, yang berada tepat di atas tumpukan (atau tepat di bawah, tergantung bagaimana Anda memikirkan tumpukan :-)- tapi di unix / linux tumpukan tumbuh ke bawah dari alamat yang tinggi).

Biasanya, proses anak kemudian akan memanggil panggilan execve()sistem, yang akan membuang semua yang ada dalam memori (virtual) dan merekonstruksi dari bagian kode dan data dalam file biner yang ditentukan.

Namun, ketika ia merekonstruksi stack, ia menyalin lingkungan dan string argumen yang dilewatkan execve()ke stack terlebih dahulu (dalam urutan itu), sebelum memanggil main()fungsi (banyak pekerjaan dilakukan dalam crt0kode bootstrap setelah execve()pengembalian (ke entri) titik yang ditentukan dalam biner)).

Ada pembungkus untuk execve()pemanggilan sistem di pustaka C yang akan melewati lingkungan saat ini (yaitu salinan lingkungan orang tua), alih-alih pemanggil yang menyediakannya (jadi akibatnya anak akan mewarisi lingkungan orang tua) - lihat environ(7).

Coba jalankan (sebagai root) perintah ps axeww | less... ini akan menunjukkan lingkungan untuk semua proses! Yang menarik adalah proses id 1 (yaitu initproses - proses pertama yang dibuat oleh kernel saat boot).

Jika Anda ingin melihat lingkungan untuk proses tertentu (dan Anda tahu itu proses id), coba jalankan perintah cat /proc/<PID>/environ(ganti <PID>dengan id proses).

Perhatikan bahwa jika suatu proses memiliki hak istimewa yang cukup, ia dapat menulis ulang tumpukannya sendiri, yang dapat membuatnya sulit untuk mengetahui apa lingkungannya - Anda akan melihat beberapa proses daemon seperti ini di output ps.

Tetapi pada akhirnya, semua wafel ini bermuara pada apa yang dikatakan @chaos di atas, jika Anda ingin melihat nilai saat ini dari variabel lingkungan tertentu dalam proses shell Anda, cukup gunakan perintah (builtin) echo "$<NAME>"(ganti <NAME>dengan nama variabel lingkungan tempat Anda tertarik) ... ketahuilah bahwa variabel yang sama mungkin memiliki nilai yang berbeda, atau tidak ada sama sekali, dalam proses lain.

Murray Jensen
sumber
1
(1) Perhatikan bahwa eopsi untuk ps, dan /proc/…/environfile khusus, mungkin tidak ada pada semua sistem. (2) AFAIK, setiap proses Unix memiliki hak istimewa untuk menulis ulang tumpukannya dan memodifikasi variabel lingkungannya. (3) Untuk diskusi lebih lanjut, lihat Kepada siapa variabel lingkungan termasuk? (pada Pengguna Super ).
G-Man Mengatakan 'Reinstate Monica'
Dalam benak saya ada beberapa sistem yang memiliki cara untuk mencegah proses yang tidak terjangkau dari "menyembunyikan" argumen baris perintah dan lingkungannya misal dari root running ps... tapi sekarang setelah Anda menyoroti poin ini, saya tidak dapat mengingat mengapa saya memikirkan itu.
Murray Jensen
@MurrayJensen menurut beberapa diskusi tentang pertanyaan yang sangat saya jawab tentang “curl” menyembunyikan argumennya di ps — tidak ditentukan dalam POSIX apakah ps mengembalikan args yang semula diteruskan ke proses, atau salinan yang prosesnya mungkin telah dimodifikasi setelahnya dimulai. Beberapa sistem (saya pikir Solaris ??) menunjukkan args asli tidak peduli apa. (Inilah tautannya.) Mungkin ini yang Anda pikirkan. :)
Wildcard
Bingo! Ya, tentu saja Solaris melakukan ini dengan "benar" :-) Terima kasih atas penyegaran ...
Murray Jensen
1

Anda bisa mendapatkan apa yang Anda cari export:

export | grep HOME

Akan menampilkan isi $HOMEvariabel.

Darth Egregious
sumber
1

jika Anda harus mengatur banyak vars:

  ( set -o posix ; set ) | sort >~/vars.before

setelah mengaturnya:

  ( set -o posix ; set ) | sort >~/vars.after

dari tampilan apa yang telah ditetapkan:

  comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'

Dengan cara ini Anda akan menemukan diri Anda segera, bekerja dengan beberapa set var shell yang telah ditentukan sebelumnya dalam file cnf, yang dikombinasikan dengan tmux akan membuat Anda master manajemen konfigurasi di lingkungan shell:

  # ---------------------------------------------------------
  # cat cnf/qto.dev.host-name.cnf
  # [MainSection]
  # postgres_db_name     = dev_qto
  # postgres_db_host     = host-name
  #
  # call by: doParseCnfEnvVars cnf/qto.dev.host-name.cnf
  # ---------------------------------------------------------
  doParseCnfEnvVars(){

     cnf_file=$1;shift 1;
     test -z "$cnf_file" && echo " you should set the cnf_file !!!"

     INI_SECTION=MainSection

     ( set -o posix ; set ) | sort >~/vars.before

     eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
        -e 's/#.*$//' \
        -e 's/[[:space:]]*$//' \
        -e 's/^[[:space:]]*//' \
        -e "s/^\(.*\)=\([^\"']*\)$/export \1=\"\2\"/" \
        < $cnf_file \
        | sed -n -e "/^\[$INI_SECTION\]/,/^\s*\[/{/^[^#].*\=.*/p;}"`

     # and post-register for nice logging
     ( set -o posix ; set ) | sort >~/vars.after

     echo "INFO added the following vars from section: [$INI_SECTION]"
     comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'
  }
Yordan Georgiev
sumber