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
echo
perintah untuk menunjukkan nilai variabel lingkungan saat ini.
Bagaimana saya melakukan ini di terminal Linux?
command-line
environment-variables
iLearnSlow
sumber
sumber
echo
adalah 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 seperti1
,*
misalnya. Dan Anda tidak dapat menggunakan pendekatan itu untuk env vars yang namanya tidak valid sebagai nama variabel shell.printenv VAR
akan menampilkan semuanya (setidaknya untuk implementasi GNU).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
sumber
printenv
variablename
hanya akan menampilkan variabel bernama; misalnya,printenv HOME
akan melakukan hal yang kira - kira sama denganecho "$HOME"
.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 memanggilmain()
fungsi (banyak pekerjaan dilakukan dalamcrt0
kode bootstrap setelahexecve()
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) - lihatenviron(7)
.Coba jalankan (sebagai root) perintah
ps axeww | less
... ini akan menunjukkan lingkungan untuk semua proses! Yang menarik adalah proses id 1 (yaituinit
proses - 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.sumber
e
opsi untukps
, dan/proc/…/environ
file 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 ).ps
... tapi sekarang setelah Anda menyoroti poin ini, saya tidak dapat mengingat mengapa saya memikirkan itu.Anda bisa mendapatkan apa yang Anda cari
export
:Akan menampilkan isi
$HOME
variabel.sumber
jika Anda harus mengatur banyak vars:
setelah mengaturnya:
dari tampilan apa yang telah ditetapkan:
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:
sumber