Untuk beberapa sesi shell saya ingin dapat mencetak bendera peringatan jika variabel shell tidak diatur dan diekspor.
Cukup mudah untuk melakukan hal seperti ini untuk mencetak "Kesalahan" pada prompt jika SET_ME
tidak disetel atau null.
test_var () { test -z "$1" && echo Error; }
PS1='$(test_var "$SET_ME") \$ '
Namun ini gagal menandai jika saya mengatur SET_ME
tanpa mengekspornya, yang merupakan kesalahan yang ingin saya deteksi. Kurang dari sesuatu seperti $(bash -c 'test -z "$SET_ME" && echo Error;')
atau menangkap output export
, apakah ada pemeriksaan sederhana yang dapat saya lakukan untuk menguji apakah SET_ME
telah diekspor?
Solusi non-POSIX, bash-only sepenuhnya dapat diterima.
bash
environment-variables
CB Bailey
sumber
sumber
typeset
atribut lain .-z "$1"
menganggap saya melewati nilai variabel ketest_var
(seperti saya) sedangkandeclare -p
mengharapkan namanya. Saya datang dengan tes ini yang mengambil nama dari variabel shell:test_exported_notnull () { re='^declare -\w*x'; [[ -n $(eval echo \$$1) ]] && [[ $(declare -p "$1") =~ $re ]]; }
.eval
, tambahkan saja baris pertama ini:,var=$1
lalu gunakan[[ -z "${!var}" ]] && echo Error
.Saya sadar pertanyaannya adalah 3 tahun, namun orang dapat menemukan solusi berikut lebih sederhana:
jawaban, jika variabel diekspor dan memiliki nilai tidak kosong.
sumber
Di Bash 4.4 atau lebih baru , Anda bisa menggunakan
${parameter@a}
ekspansi parameter shell untuk mendapatkan daftar atribut tentang parameter, termasuk jika diekspor.Ini adalah fungsi sederhana yang diperagakan
${parameter@a}
, yang akan memberi tahu Anda jika variabel yang diberikan diekspor, diberi namanya:Contoh penggunaan:
Bagaimana itu bekerja:
Format yang dikembalikan oleh
${parameter@a}
adalah satu karakter per atribut, dengan arti setiap karakter atribut berasal dari opsi yang sesuai dari perintah mendeklarasikan - dalam hal ini, kami ingin mencarix
- diekspor.sumber
Anda dapat menggunakan
compgen
dengan yang-X
pilihan untuk menentukan apakah variabel diekspor:Misalnya:
sumber
Jika saya pasrah harus menggunakan
export
dangrep
, tes paling sederhana mungkin adalah sesuatu seperti ini.atau jika saya ingin non-null juga:
sumber
export
itu tidak ditentukan, dan mendefinisikan format yang tepat untukexport -p
mirip dengan bashexport
tetapi berbeda. Tetapi bash tampaknya mengabaikan POSIX dan menggunakan format yang sama sepertiexport
untukexport -p
!The
export
perintah, diberikan tanpa parameter, memberikan daftar nama diekspor dalam lingkungan saat ini:Beberapa pemotongan dan seding menghilangkan bulu:
Ada daftar ekspor Anda, siap untuk diproses lebih lanjut.
sumber
export
") karena penggunaan yang direncanakan ada pada prompt saya.export
, dan ini adalah satu-satunya hal yang saya dapatkan. Tidak ada bantuan dari shell yang lolos. Ituexport
sudah builtin, tapi saya ragu Anda bisa menghindarigrep
.Metode paling sederhana yang saya pikirkan saat ini:
sumber