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
?
cmd
untuk itu.
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
?
cmd
untuk itu.
Jawaban:
Selain dengan -i
opsi, yang menghapus seluruh lingkungan, POSIX env
tidak menyediakan cara untuk menghapus variabel.
Namun, dengan beberapa env
implementasi (termasuk busybox
setidaknya GNU, 'dan FreeBSD), Anda dapat melakukan:
env -u ENV_VAR command
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 menerima env '=value'
, mungkin batasan dikeluarkan oleh unsetenv()
fungsi C yang diperlukan POSIX untuk mengembalikan kesalahan untuk string kosong, sementara tidak ada batasan untuk putenv()
)).
Mudah dibawa (dalam kulit POSIX), Anda dapat melakukan:
(unset -v ENV_VAR; exec command)
(perhatikan bahwa dengan beberapa shell, gunakan exec
can change yang command
dijalankan: jalankan yang ada di filesystem alih-alih fungsi atau builtin misalnya (dan akan memotong alias
ekspansi dengan jelas), seperti di env
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 dan bash
yang unset
tanpa itu -v
dapat membatalkan ENV_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
yang unset
, dalam keadaan tertentu mungkin tidak menghapus variabel, tetapi mengungkapkan variabel dalam lingkup luar )
Jika perl
tersedia, Anda dapat melakukan:
perl -e 'delete $ENV{shift@ARGV}; exec @ARGV or die$!' ENV_VAR command
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
:
env -u LANG printf -v var %.3f 1.2 # would run /usr/bin/printf instead
(unset -v LANG; printf -v var %.3f 1.2) # changes to $var lost afterwards
(di sini unsetting LANG sebagai pendekatan yang salah dalam memastikan .
digunakan dan dipahami sebagai pemisah desimal. Akan lebih baik digunakan LC_ALL=C printf...
untuk itu)
Dengan beberapa shell, Anda bisa membuat ruang lingkup lokal untuk variabel menggunakan fungsi:
without() {
local "$1" # $1 variable declared as initially unset in bash¹
shift
"$@"
}
without LANG printf -v var %.3f 1.2
Dengan zsh
, Anda juga dapat menggunakan fungsi anonim:
(){local ENV_VAR; command}
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 melakukannya local ENV_VAR; unset ENV_VAR
, tetapi jangan lakukan itu di dalam mksh
atau yash
( typeset
alih-alih local
untuk yang itu) karena itu tidak akan berhasil, unset
itu hanya akan membatalkan local
.
¹ Berhati-hatilah juga bahwa dalam bash
, lokal ENV_VAR
(meskipun tidak disetel) akan mempertahankan atribut ekspor . Jadi jika command
fungsi yang memberikan nilai ENV_VAR
, variabel akan tersedia di lingkungan perintah yang disebut sesudahnya. unset ENV_VAR
akan menghapus atribut itu. Atau Anda dapat menggunakan local +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 itu bash
).
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:
(unset ENV_VAR; exec command)
(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):
$ export ENV_VAR=foo
$ mycommand
ENV_VAR: foo
$ ENV_VAR=bar mycommand
ENV_VAR: bar
$ ENV_VAR= mycommand
ENV_VAR:
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.