Mari kita perhatikan contoh spesifik. The grep
perintah menggunakan variabel lingkungan yang disebut GREP_OPTIONS
untuk mengatur opsi default.
Sekarang. Mengingat bahwa file tersebut test.txt
berisi baris-baris berikut:
line one
line two
menjalankan perintah grep one test.txt
akan kembali
line one
Jika Anda menjalankan grep dengan -v
opsi, itu akan mengembalikan garis yang tidak cocok, sehingga hasilnya akan menjadi
line two
Kami sekarang akan mencoba untuk mengatur opsi dengan variabel lingkungan.
Variabel lingkungan yang ditetapkan tanpa export
tidak akan diwarisi dalam lingkungan perintah yang Anda panggil.
GREP_OPTIONS='-v'
grep one test.txt
Hasil:
line one
Jelas, opsi -v
tidak diteruskan grep
.
Anda ingin menggunakan formulir ini ketika Anda menetapkan variabel hanya untuk shell untuk digunakan, misalnya di for i in * ; do
Anda tidak ingin mengekspor $i
.
Namun, variabel diteruskan ke lingkungan baris perintah tertentu, sehingga Anda dapat melakukannya
GREP_OPTIONS='-v' grep one test.txt
yang akan mengembalikan yang diharapkan
line two
Anda menggunakan formulir ini untuk sementara waktu mengubah lingkungan dari program khusus yang diluncurkan ini.
Mengekspor variabel menyebabkan variabel diwariskan:
export GREP_OPTIONS='-v'
grep one test.txt
kembali sekarang
line two
Ini adalah cara paling umum pengaturan variabel untuk penggunaan proses selanjutnya dimulai dalam shell
Ini semua dilakukan dalam bash. export
adalah bash builtin; VAR=whatever
adalah sintaks bash. env
, di sisi lain, adalah program itu sendiri. Ketika env
dipanggil, hal-hal berikut terjadi:
- Perintah
env
dijalankan sebagai proses baru
env
memodifikasi lingkungan, dan
- memanggil perintah yang disediakan sebagai argumen. The
env
Proses digantikan oleh command
proses.
Contoh:
env GREP_OPTIONS='-v' grep one test.txt
Perintah ini akan meluncurkan dua proses baru: (i) env dan (ii) grep (sebenarnya, proses kedua akan menggantikan yang pertama). Dari sudut pandang grep
proses, hasilnya persis sama dengan menjalankan
GREP_OPTIONS='-v' grep one test.txt
Namun, Anda dapat menggunakan idiom ini jika Anda berada di luar bash atau tidak ingin meluncurkan shell lain (misalnya, ketika Anda menggunakan rangkaian exec()
fungsi alih-alih system()
panggilan).
Catatan tambahan aktif #!/usr/bin/env
Ini juga mengapa idiom #!/usr/bin/env interpreter
digunakan daripada #!/usr/bin/interpreter
. env
tidak memerlukan path lengkap ke suatu program, karena ia menggunakan execvp()
fungsi yang mencari melalui PATH
variabel seperti halnya shell, dan kemudian menggantikan dirinya dengan perintah run. Dengan demikian, dapat digunakan untuk mencari tahu di mana seorang penerjemah (seperti perl atau python) "duduk" di jalan.
Ini juga berarti bahwa dengan memodifikasi jalur saat ini Anda dapat memengaruhi varian python mana yang akan dipanggil. Ini memungkinkan hal-hal berikut:
echo -e '#!/usr/bin/bash\n\necho I am an evil interpreter!' > python
chmod a+x ./python
export PATH=.
calibre
alih-alih meluncurkan Calibre, akan menghasilkan
I am an evil interpreter!
export key=value
ini adalah sintaks yang diperluas dan tidak boleh digunakan dalam skrip portabel (yaitu#! /bin/sh
).