Seringkali saya akan mem-bash skrip bash dan menurut saya ada beberapa cara menetapkan variabel:
key=value
env key=value
export key=value
Ketika Anda berada di dalam skrip atau perintah tunggal (misalnya, saya akan sering rantai variabel dengan peluncur Wine untuk menetapkan awalan Wine yang tepat) ini tampaknya benar-benar dipertukarkan tetapi tentu saja itu tidak bisa terjadi.
Apa perbedaan antara ketiga metode ini dan dapatkah Anda memberi saya contoh kapan saya secara khusus ingin menggunakan masing-masing metode tersebut?
Jelas terkait dengan Apa perbedaan antara `VAR = ...` dan `export VAR = ...`? tapi saya ingin tahu seberapa env
cocok dengan ini juga, dan beberapa contoh yang menunjukkan manfaat masing-masing akan menyenangkan juga :)
command-line
bash
Oli
sumber
sumber
export key=value
ini adalah sintaks yang diperluas dan tidak boleh digunakan dalam skrip portabel (yaitu#! /bin/sh
).Jawaban:
Mari kita perhatikan contoh spesifik. The
grep
perintah menggunakan variabel lingkungan yang disebutGREP_OPTIONS
untuk mengatur opsi default.Sekarang. Mengingat bahwa file tersebut
test.txt
berisi baris-baris berikut:menjalankan perintah
grep one test.txt
akan kembaliJika Anda menjalankan grep dengan
-v
opsi, itu akan mengembalikan garis yang tidak cocok, sehingga hasilnya akan menjadiKami sekarang akan mencoba untuk mengatur opsi dengan variabel lingkungan.
Variabel lingkungan yang ditetapkan tanpa
export
tidak akan diwarisi dalam lingkungan perintah yang Anda panggil.Hasil:
Jelas, opsi
-v
tidak diteruskangrep
.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
yang akan mengembalikan yang diharapkan
Anda menggunakan formulir ini untuk sementara waktu mengubah lingkungan dari program khusus yang diluncurkan ini.
Mengekspor variabel menyebabkan variabel diwariskan:
kembali sekarang
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. Ketikaenv
dipanggil, hal-hal berikut terjadi:env
dijalankan sebagai proses baruenv
memodifikasi lingkungan, danenv
Proses digantikan olehcommand
proses.Contoh:
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 menjalankanNamun, 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-alihsystem()
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 menggunakanexecvp()
fungsi yang mencari melaluiPATH
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:
alih-alih meluncurkan Calibre, akan menghasilkan
sumber
env
berasal? Maksud saya ketika Anda membuka shell baru Anda selalu memiliki beberapa variabel. Jadi beberapa program harus sudahexport
mengeditnya, kan?set var=blah
?