Sebuah lingkungan tidak semanis kelihatannya. Shell menyimpannya di memori dan beralih ke execve()
panggilan sistem. Proses anak mewarisinya sebagai pointer array yang disebut environ
. Dari halaman execve
manual:
RINGKASAN
#include <unistd.h>
int execve(const char *filename, char *const argv[],
char *const envp[]);
argv
adalah serangkaian string argumen yang diteruskan ke program baru.
Secara konvensi, string pertama harus berisi nama file yang terkait dengan file yang dieksekusi. envp
adalah larik string, secara konvensional dari key key = value, yang dikirimkan sebagai lingkungan ke program baru.
Halaman environ(7)
manual ini juga menawarkan beberapa wawasan:
RINGKASAN
extern char **environ;
DESKRIPSI
Variabel environ
menunjuk ke array pointer ke string yang disebut "lingkungan". Pointer terakhir dalam array ini memiliki nilai NULL
. (Variabel ini harus dideklarasikan dalam program pengguna, tetapi dideklarasikan dalam file header <unistd.h>
jika file header berasal dari libc4 atau libc5, dan dalam kasus mereka berasal dari glibc dan _GNU_SOURCE didefinisikan.) Array string ini tersedia untuk proses oleh panggilan exec (3) yang memulai proses.
Kedua manual GNU ini sesuai dengan spesifikasi POSIX
exec(3)
keluarga (yaitu mereka yang tidak cocok dengan eksekutif * v) lulus ** lingkungan di bawah selimut.exec*e
varian yang secara eksplisit melewati env, alih-alih secara implisit menggunakanenviron
variabel global. Thev
berarti "vektor", dan mengacu pada argumen baris perintah lulus sebagai array (bukan "daftar" (fungsi variabel-panjang))execve
adalah panggilan sistem, dan semua lainnyaexec*
fungsi pembungkus libc untuk itu.Anda salah sedikit:
SOME_NAME=value
membuat variabel shell (di sebagian besar shell).export SOME_NAME=value
menciptakan variabel lingkungan. Untuk yang lebih baik menjadi lebih buruk, kebanyakan shell Unix / Linux / * BSD menggunakan sintaksis yang identik dalam mengakses variabel lingkungan dan variabel shell.Dalam arti yang lebih besar, "lingkungan" hanyalah informasi yang sejalan dengan eksekusi program. Dalam program C, Anda mungkin menemukan ID proses dengan
getpid()
panggilan, dalam program shell Anda akan menggunakan akses variabel:$$
. ID proses hanyalah bagian dari lingkungan program. Saya percaya istilah "lingkungan" berasal dari beberapa topik ilmu komputer yang lebih teoritis, seperti pelaksanaan program pemodelan. Model pelaksanaan program memiliki lingkungan "yang berisi hubungan antara variabel dan nilai-nilai mereka".Dan yang terakhir ini, definisi yang lebih kuat adalah apa "lingkungan" untuk shell Unix / Linux / * BSD: hubungan antara nama ("variabel") dan nilainya. Untuk sebagian besar kerang gaya Unix, nilainya semua string karakter, meskipun itu tidak sepenuhnya benar seperti dulu. Ksh, Zsh dan Bash semua memiliki variabel yang diketik hari ini. Bahkan definisi fungsi shell dapat diekspor.
Penggunaan lingkungan yang terpisah dari variabel shell biasa melibatkan
fork/exec
metode memulai proses baru yang digunakan semua Unix. Ketika Andaexport
pasangan nama / nilai, pasangan nama / nilai itu akan hadir di lingkungan executable baru, dimulai oleh shell denganexecve(2)
panggilan sistem (biasanya mengikuti afork(2)
, kecuali ketikaexec
perintah shell digunakan).Berikut ini
execve()
,main()
fungsi biner baru memiliki argumen baris perintah, lingkungan (disimpan sebagai array pointer yang diakhiri NULL kevar=value
string, lihatenviron(7)
halaman manual). Keadaan lain yang diwariskan termasukulimit
pengaturan, direktori kerja saat ini, dan deskriptor file terbuka yangexecve()
pemanggil tidak memiliki FD_CLOEXEC diatur untuk. Keadaan tty saat ini (diaktifkan echo, mode mentah, dll.) Juga dapat dianggap sebagai bagian dari kondisi eksekusi yang diwarisi oleh proses yang baruexec
.Lihat
bash
deskripsi manual tentang lingkungan eksekusi untuk perintah sederhana (selain fungsi builtin atau shell).Lingkungan Unix berbeda dari setidaknya beberapa sistem operasi lain: "leksikal" VMS dapat diubah oleh proses anak, dan perubahan itu terlihat pada induknya. VMS
cd
dalam proses anak akan memengaruhi direktori kerja induk. Setidaknya dalam beberapa keadaan, dan ingatan saya mungkin mengecewakan saya.Beberapa variabel lingkungan yang terkenal,
$HOME
,$PATH
,$LD_LIBRARY_PATH
dan lain-lain. Beberapa konvensional untuk sistem pemrograman tertentu, sehingga shell induk dapat memberikan banyak dan banyak informasi tujuan khusus untuk beberapa program, seperti direktori sementara tertentu, atau ID pengguna dan kata sandi yang tidak muncul dips -ef
. Program CGI sederhana mewarisi banyak informasi dari server web melalui variabel lingkungan, misalnya.sumber
SOME_NAME=value command
akan menetapkan variabel lingkungan SOME_NAME untuk permintaan perintah itu. Yang membingungkan, sepertinya tidak mengatur variabel shell dengan nama yang sama.SOME_NAME=value command
berperilaku bertentangan dengan harapan Anda adalah bahwa itu adalah sintaks khusus yang berarti "tambahkan SOME_NAME ke lingkungan yang dikirimkan ke perintah tetapi jangan ubah variabel shell ini".fork()
ed, tetapi mereka lakukan menerima (salinan) variabel shell.Variabel lingkungan dalam bentuk paling mentah mereka hanya satu set pasangan nama / nilai. Seperti yang dijelaskan di halaman bash man (
man 1 bash
) di bawah bagian LINGKUNGAN:Dalam istilah praktis, ini memungkinkan Anda untuk mendefinisikan perilaku yang dibagikan atau unik untuk program yang dipanggil dari shell saat ini. Misalnya, saat menggunakan
crontab
atauvisudo
Anda dapat mendefinisikanEDITOR
variabel lingkungan untuk menentukan editor lain selain yang akan digunakan sistem Anda secara default. Hal yang sama dapat berlaku untuk hal-hal sepertiman
perintah yang melihatPAGER
lingkungan Anda untuk mengetahui program pager apa yang harus digunakan untuk menampilkan output dari halaman manual.Cukup banyak perintah unix membaca lingkungan dan tergantung pada apa yang diatur di sana, ubah output / pemrosesan / tindakan mereka tergantung pada ini. Beberapa dibagikan, beberapa unik untuk program ini. Sebagian besar halaman manual berisi informasi tentang bagaimana variabel lingkungan memengaruhi program yang dijelaskan.
Ilustrasi praktis lainnya adalah untuk hal-hal seperti sistem dengan beberapa pemasangan Oracle pada platform yang sama. Dengan pengaturan
ORACLE_HOME
, seluruh rangkaian perintah oracle (seperti yang dimuat dariPATH
variabel lingkungan Anda ) kemudian tarik pengaturan, definisi, pemetaan dan pustaka dari bawah direktori tingkat atas itu. Hal yang sama berlaku untuk program lain seperti java denganJAVA_HOME
variabel lingkungannya.bash sendiri memiliki banyak variabel lingkungan yang dapat mengubah perilaku berbagai hal mulai dari riwayat (
HISTSIZE
,HISTFILE
dll), ukuran layar (COLUMNS
), penyelesaian tab (FIGNORE
,GLOBIGNORE
) lokal dan pengkodean / dekode karakter (LANG
,LC_*
), prompt (PS1
..PS4
), dan sebagainya (lagi mencari pengetahuan dari halaman bash man).Anda juga dapat menulis skrip / program yang memanfaatkan variabel lingkungan kustom Anda sendiri (untuk lulus pengaturan, atau mengubah fungsionalitas).
sumber
"Variabel Lingkungan" adalah seperangkat nilai bernama dinamis yang dapat memengaruhi cara proses yang berjalan akan berperilaku di komputer.
Mereka adalah bagian dari lingkungan operasi tempat suatu proses berjalan. Misalnya, proses yang berjalan dapat meminta nilai variabel lingkungan TEMP untuk menemukan lokasi yang cocok untuk menyimpan file sementara, atau variabel HOME atau USERPROFILE untuk menemukan struktur direktori yang dimiliki oleh pengguna yang menjalankan proses.
Info lebih lanjut di sini → http://en.wikipedia.org/wiki/Environment_variable .
Segala sesuatu yang ingin Anda ketahui tentang Variabel Lingkungan ... ↑
sumber
Jawaban ini membutuhkan beberapa pengalaman dan pengetahuan skrip shell dengan variabel istilah, nilai, penggantian variabel, prompt, echo, kernel, shell, utilitas, sesi dan proses.
Sebuah variabel lingkungan (envar) adalah satu set variabel yang didefinisikan global yang dapat mempengaruhi cara proses tertentu akan berperilaku pada sistem operasi komputer.
1. Pengantar teladan:
Kami mengganti utusan dengan huruf a
$
dan huruf kapital . Sebagai contoh:$PS1
.Kami dapat mencetak envar dengan cara ini:
$PS1
memegang nilai prompt Unix. Katakanlah nilai asalnya\u
\w
$
.\u
singkatan dari pengguna (saat ini),\w
singkatan direktori kerja,$
adalah untuk membatasi prompt.Jadi, jika kita lakukan:,
echo $PS1
kita melihat nilai-nilai\u
,\w
ditambah tanda dolar pada akhirnya.Kita bisa mengubah perilaku Unix dalam konteks itu, jika kita mengubah nilai envar itu. Sebagai contoh:
Sekarang prompt tampak seperti ini (dengan asumsi direktori kerja bernama "John"):
Dengan cara yang sama yang bisa kita lakukan
PS1="Hello, I'm your prompt >"
, makaecho $PS1
akan membawa:Di Bash 4.xx, kita bisa mencetak SEMUA envars di sistem dengan
env
perintah. Saya sarankan mengeksekusienv
di terminal dan melihat outputnya.2. Bagaimana data ini ditampilkan dan dimanipulasi:
Terminal sesi mari kita untuk menyesuaikan envars yang datang dengan Bash.
Perubahan yang disebutkan di atas biasanya bersifat sementara, dan inilah alasannya:
Setiap sesi (yang bukan merupakan sub-sesi) adalah unik, dan beberapa proses dapat berjalan secara unik pada waktu yang sama (masing-masing dengan set envars sendiri) tetapi biasanya ada warisan dari sesi 0 hingga sesi 1 dan ke atas.
Perubahan yang kami buat pada satu proses adalah unik untuknya, dan akan berhenti jika kami menutupnya tanpa menyimpannya dengan cara tertentu.
Jadi bagaimana kita menyimpan perubahan ini:
Ada beberapa jenis cara yang tersedia untuk menyimpan perubahan envar, tergantung pada ruang lingkup yang kami pilih. Berikut ini cakupan (level) yang berbeda untuk perubahan tersebut:
Di mana data envar disimpan:
Unix dibangun dari 3 lapisan utama: Kernel, shell, dan utilitas. AFAIK setiap shell memiliki envars sendiri, dan ini dibangun terutama atau secara eksklusif di shell.
Lokasi spesifik untuk mengubahnya secara global biasanya
/etc/profile
meskipun kita juga bisa melakukannya.bashrc
tentunya.3. Membuat envars baru:
Kita dapat membuat envars baru dan inilah caranya; pada Bash 4.xx tidak ada nama asli enavar
MESSAGE
(seperti yang dikatakan, para envars biasanya ditulis dalam huruf besar).akan membuatnya untuk kita, dan sekarang jika kita mengetik gema
$MESSAGE
, kita dapatkanhello world!
.Jika kami akan mengeksekusi
bash
di sesi kerja kami saat ini (jendela), kami akan memulai sub-sesi bash baru dan tidak akan lagi bekerja dalam proses asli, kecuali kami mengeksekusiexit
.Catatan: Dalam sistem operasi dengan emulator terminal (seperti desktop Ubuntu), sub-sesi biasanya berjalan di jendela yang sama, tetapi sesi baru di jendela lain bukanlah sub-sesi dari yang sudah ada (ini adalah proses yang berdekatan ) .
Catatan: Jangan gunakan tanda khusus dalam nilai envar seperti! atau mereka tidak akan diselamatkan.
Mengekspor envar dari sesi awal ke semua sub-sesi:
Kita masih dapat menggunakan envar yang dibuat di sesi pertama, di sesi kedua juga, tanpa mendaftarkannya di file konfigurasi pengguna atau tingkat global (lihat data berikut). Berikut cara melakukannya:
Buka sesi asli (apakah pada jendela saat ini atau yang lain) dan jalankan:
saat mengekspor, jangan gunakan
$
tanda.Sekarang diekspor ke semua sub-sesi. Jika Anda akan melakukannya
echo $MESSAGE
pada sub-sesi, apakah dari pengguna Anda atau yang lain, maka akan dicetak.Perhatikan bahwa variabel internal Shell seperti
PS1
tidak boleh diekspor, tetapi jika Anda ingin mengekspornya dari alasan apa pun dan tidak muncul, jangan jalankanbash
setelahnyaexport
, tetapi lakukanbash –norc
.4. The $ PATH envar:
$PATH
adalah envar yang paling sering diubah pengguna.Jika kita
echo $PATH
, kita akan melihat aliran ini:Nilai cetakan envar ini dipisahkan oleh titik dua (:) di sana, tapi di sini ada cara yang berpotensi lebih nyaman (ini adalah nilai yang sama ):
Ini adalah direcotries untuk mencari, ketika kita menjalankan utilitas.
Dengan mengeksekusi
which echo
kita akan mendapatkan lokasi file - misalnya, kita mungkin melihatnya ada di/bin/echo
.Berdasarkan itu kita tidak perlu mengetikkan echo envar untuk melihat nilai evnar. Kami juga dapat melakukan:
Envar masih akan dieksekusi, misalnya:
Memberi kita
Sama seperti:
Memberi kita
Catatan:
$HOME
disingkat~
.System- $ PATH relations, dan kemungkinan interaksi pengguna:
Dalam Bash 4.xx, ketika kita menggunakan utilitas tanpa path lengkapnya, sistem akan menggunakan semua 6 nilai yang disebutkan di atas, dari
$PATH
envar. Jadi, itu akan mulai dari/user/local/bin
, dan akan mengikuti semua kontennya mencari yangecho
dapat dieksekusi.Dalam hal ini, itu akan berhenti di
/bin/echo
, di mana, dalam hal ini, executable berada.Oleh karena itu, alasan utama kita dapat menyesuaikan
$PATH
envar, adalah menginstal executable yang tidak berada di bawah nilai asalnya.Setelah menginstal executable tersebut, kita harus menetapkan
$PATH
nilainya sesuai dan kemudian kita akan dapat bekerja dengannya.5. Lampiran - berkembang
$PATH
:Kita dapat
export $PATH
mem-bash sub-sesi (yang mencakup ekstensi bash seperti WP-CLI untuk WordPress atau Drush untuk Drupal) dengan cara ini:Ini akan menambahkan nilai baru
/home/John
ke$PATH
, dan kemudian setelah itu, itu akan melampirkan nilai-nilai asli padanya (tepat setelah titik dua), yang disimpan di bawah sintaks$PATH
.Perubahan permanen tersebut dapat dilakukan dalam skrip yang relevan, biasanya
/etc/profile
dengan nama.bashrc
.sumber
!
nilai variabel lingkungan yang tidak berfungsi yang tepat di bawah contoh yang menunjukkan itu berfungsi, gagasan salah sub-sesi, saran yang cukup aneh tentang apa yang harus dilakukan setelah mengekspor variabel shell, dan gagasan keliru tentang variabel lingkungan global.warning about ! in an environment variable value not working that is right below an example showing it working
? Tolong contoh.quite bizarre advice about what to do after exporting a shell variable
, apa sebenarnya maksud Anda?false notion of global environment variables
, apa sebenarnya maksud Anda?