Saya dapat menjalankan ENV_VAR=value command
untuk menjalankan command
dengan nilai spesifik untuk ENV_VAR
. Apa yang setara dengan tidak disetel ENV_VAR
untuk command
?
shell
environment-variables
Alexey Romanov
sumber
sumber
command
adalah pilihan malang placeholder, karena ada sebenarnya adalah built-in perintah dengan nama itu.mycommand
atausomecommand
atau mungkin itu adalah kebiasaan yang lebih baik untuk masuk.cmd
untuk itu.Jawaban:
Selain dengan
-i
opsi, yang menghapus seluruh lingkungan, POSIXenv
tidak menyediakan cara untuk menghapus variabel.Namun, dengan beberapa
env
implementasi (termasukbusybox
setidaknya GNU, 'dan FreeBSD), Anda dapat melakukan:Yang akan bekerja untuk menghapus setiap instance dari
ENV_VAR
variabel dari lingkungan (perlu dicatat bahwa itu tidak bekerja untuk variabel lingkungan dengan nama kosong (env -u ''
baik memberikan kesalahan atau tidak efektif tergantung pada implementasi meskipun semua menerimaenv '=value'
, mungkin batasan dikeluarkan olehunsetenv()
fungsi C yang diperlukan POSIX untuk mengembalikan kesalahan untuk string kosong, sementara tidak ada batasan untukputenv()
)).Mudah dibawa (dalam kulit POSIX), Anda dapat melakukan:
(perhatikan bahwa dengan beberapa shell, gunakan
exec
can change yangcommand
dijalankan: jalankan yang ada di filesystem alih-alih fungsi atau builtin misalnya (dan akan memotongalias
ekspansi dengan jelas), seperti dienv
atas. Anda ingin menghilangkannya dalam kasus tersebut) .Tapi itu tidak akan berfungsi untuk variabel lingkungan yang memiliki nama yang tidak dapat dipetakan ke variabel shell (perhatikan bahwa beberapa shell seperti
mksh
akan menghapus variabel-variabel dari lingkungan saat startup), atau variabel yang telah ditandai hanya-baca.-v
adalah untuk shell Bourne danbash
yangunset
tanpa itu-v
dapat membatalkanENV_VAR
fungsi jika tidak ada variabel dengan nama itu. Sebagian besar shell lain tidak akan membatalkan fungsi kecuali Anda melewati-f
opsi. (tidak mungkin membuat perbedaan dalam praktik).(Waspadalah juga terhadap bug / misfeature dari
bash
/mksh
/yash
yangunset
, dalam keadaan tertentu mungkin tidak menghapus variabel, tetapi mengungkapkan variabel dalam lingkup luar )Jika
perl
tersedia, Anda dapat melakukan:Yang akan bekerja bahkan untuk variabel lingkungan dengan nama kosong.
Sekarang semua itu tidak akan berfungsi jika Anda ingin mengubah variabel lingkungan untuk builtin atau fungsi dan tidak ingin mereka berjalan dalam subkulit, seperti di
bash
:(di sini unsetting LANG sebagai pendekatan yang salah dalam memastikan
.
digunakan dan dipahami sebagai pemisah desimal. Akan lebih baik digunakanLC_ALL=C printf...
untuk itu)Dengan beberapa shell, Anda bisa membuat ruang lingkup lokal untuk variabel menggunakan fungsi:
Dengan
zsh
, Anda juga dapat menggunakan fungsi anonim:Pendekatan itu tidak akan bekerja di beberapa shell (seperti yang didasarkan pada shell Almquist), yang
local
tidak menyatakan variabel sebagai awalnya tidak disetel (tetapi mewarisi nilai dan atribut). Dalam hal itu, Anda dapat melakukannyalocal ENV_VAR; unset ENV_VAR
, tetapi jangan lakukan itu di dalammksh
atauyash
(typeset
alih-alihlocal
untuk yang itu) karena itu tidak akan berhasil,unset
itu hanya akan membatalkanlocal
.¹ Berhati-hatilah juga bahwa dalam
bash
, lokalENV_VAR
(meskipun tidak disetel) akan mempertahankan atribut ekspor . Jadi jikacommand
fungsi yang memberikan nilaiENV_VAR
, variabel akan tersedia di lingkungan perintah yang disebut sesudahnya.unset ENV_VAR
akan menghapus atribut itu. Atau Anda dapat menggunakanlocal +x ENV_VAR
yang juga akan memastikan bahwa batu tulis bersih (kecuali variabel itu telah dinyatakan sebagai read-only, tetapi kemudian tidak ada yang dapat Anda lakukan tentang hal itubash
).sumber
env '=foo' python -c 'import os; print os.environ[""]'
. Saya tidak berharap banyak orang ingin mengatur variabel seperti itu.Tidak ada padanan langsung sejauh yang saya ketahui; Anda dapat menggunakan subkulit:
sumber
(unset ENV_VAR; exec somecommand)
jika Anda ingin menjadi setara dengan yang asli dalam efisiensi (dengan mengkonsumsi subkulit). Seperti ini, ini menambahkan garpu tambahan.command
ini adalah perintah terakhir dalam doa subkulit.env -u
.Anda dapat gunakan
ENV_VAR= command
Ini sebenarnya tidak menghapus variabel, tetapi mungkin berguna dalam banyak kasus (skrip shell biasanya hanya digunakan
test -n
untuk memeriksa apakah suatu variabel diatur):sumber