Katakanlah saya mengekspor variabel:
foo=bar
export foo
Sekarang, saya ingin membatalkan ekspornya. Itu untuk mengatakan, jika saya lakukan sh -c 'echo "$foo"'
saya tidak seharusnya bar
. foo
seharusnya tidak muncul di sh -c
lingkungan sama sekali.
sh -c
hanyalah sebuah contoh, cara mudah untuk menunjukkan keberadaan suatu variabel. Perintah itu bisa berupa apa saja - itu mungkin sesuatu yang perilakunya dipengaruhi hanya oleh kehadiran variabel di lingkungannya.
Saya bisa:
unset
variabel, dan kehilangan itu- Hapus menggunakan
env
untuk setiap perintah:env -u foo sh -c 'echo "$foo"'
- tidak praktis jika Anda ingin terus menggunakan shell saat ini untuk sementara waktu.
Idealnya, saya ingin menyimpan nilai variabel, tetapi tidak memilikinya muncul sama sekali dalam proses anak, bahkan sebagai variabel kosong.
Saya kira saya bisa melakukan:
otherfoo="$foo"; unset foo; foo="$otherfoo"; unset otherfoo
Ini berisiko menginjak otherfoo
, jika sudah ada.
Apakah itu satu-satunya jalan? Apakah ada cara standar?
mktemp
jika itu cukup portabel, dan menghapus nilai, dan sumber file sementara untuk menetapkan variabel. Setidaknya file sementara dapat dibuat dengan nama yang kurang lebih berbeda dengan variabel shell.sh -c
Perintah ini hanyalah sebuah contoh. Ambil perintah apa pun di mana Anda tidak dapat menghapus variabel sebagai gantinya, jika Anda mau.Jawaban:
Tidak ada cara standar.
Anda dapat menghindari menggunakan variabel sementara dengan menggunakan fungsi. Fungsi berikut berhati-hati untuk menjaga variabel yang tidak disetel tidak disetel dan mengosongkan variabel. Namun tidak mendukung fitur yang ditemukan di beberapa shell seperti read-only atau variabel yang diketik.
Di ksh, bash, dan zsh, Anda dapat menghapus variabel dengan
typeset +x foo
. Ini mempertahankan properti khusus seperti tipe, jadi lebih baik menggunakannya. Saya pikir semua shell yang memilikitypeset
builtin milikitypeset +x
.sumber
${var+foo}
, itu mengevaluasifoo
apakahvar
diatur, bahkan jika kosong, dan tidak ada yang sebaliknya.typeset +x
vsexport -n
untuk cangkang yang mendukung yang sebelumnya? Apakahexport -n
lebih jarang, atau tidak mempertahankan beberapa properti?export -n
atautypeset +x
acuh tak acuh. Di ksh atau zsh, hanya adatypeset +x
.EDIT: Hanya untuk
bash
, seperti yang ditunjukkan dalam komentar:The
-n
pilihan untukexport
menghapusexport
properti dari masing-masing nama yang diberikan. (Lihathelp export
.)Jadi untuk
bash
, perintah yang Anda inginkan adalah:export -n foo
sumber
Saya menulis fungsi POSIX serupa, tetapi ini tidak berisiko eksekusi kode arbitrer:
Ini juga akan menangani argumen sebanyak yang Anda mau berikan. Jika argumen adalah nama yang valid yang tidak diatur sebelumnya, maka diam-diam diabaikan. Jika argumen adalah nama yang buruk ia menulis ke stderr dan berhenti sesuai, meskipun nama yang valid sebelum yang tidak sah pada baris perintah masih akan diproses.
Saya memikirkan cara lain. Saya sangat menyukainya.
Yah, keduanya menggunakan banyak teknik yang sama. Pada dasarnya jika var shell tidak disetel referensi untuk itu tidak akan diperluas dengan
+
ekspansi parameter. Tetapi jika diatur - terlepas dari nilainya - ekspansi parameter seperti:${parameter+word}
akan diperluas keword
- dan tidak ke nilai variabel. Dan begitu juga variabel swa-uji dan swa-pengganti pada kesuksesan.Mereka juga bisa gagal sendiri . Dalam fungsi teratas jika ditemukan nama buruk, saya pindah
$1
ke$2
dan meninggalkan$1
nol karena hal berikutnya yang saya lakukan adalahreturn
berhasil jika semua arg telah diproses dan loop di akhir, atau, jika arg tidak valid, shell akan memperluas$2
ke$1:?
mana akan membunuh shell scripted dan mengembalikan interupsi ke yang interaktif saat menulisword
ke stderr.Yang kedua
getopts
mengerjakan tugas. Dan itu tidak akan menetapkan nama yang buruk - melainkan menulisnya akan menulis pesan kesalahan standar ke stderr. Terlebih lagi itu menyimpan nilai argumen$OPTARG
jika argumen adalah nama variabel set di tempat pertama. Jadi setelah melakukangetopts
semua yang diperlukan adalah ekspansieval
setOPTARG
ke penugasan yang sesuai.sumber
export
nama yang aneh, itu tidak akan mematikan komputer Anda.var=something; varname=var; export "$varname"
sangat valid. hal yang sama berlaku untukunset
, dan dengan ini dan dengan yang lain, tetapi begitu isi"$varname"
variabel itu menjadi gila, itu bisa disesalkan. dan begitulah keseluruhanbash
kegagalan ekspor fungsi itu terjadi.