Karakter apa yang diizinkan dalam nama variabel lingkungan Linux? Pencarian sepintas tentang halaman manual dan web hanya menghasilkan informasi tentang cara bekerja dengan variabel, tetapi tidak dengan nama mana yang diizinkan.
Saya memiliki program Java yang memerlukan variabel lingkungan yang ditentukan yang berisi titik, seperti com.example.fancyproperty
. Dengan Windows saya dapat mengatur variabel itu, tetapi saya tidak beruntung mengaturnya di linux (dicoba di SuSE dan Ubuntu). Apakah nama variabel itu bahkan diizinkan?
linux
syntax
environment-variables
Christian Semrau
sumber
sumber
-D
opsi baris perintah), jadi ia bekerja sekarang. Jelas program terlihat di kedua set variabel tanpa memberi tahu saya. Tapi saya masih penasaran tentang nama variabel lingkungan mana yang diperbolehkan.com_example_fancyproperty
danCOM_EXAMPLE_FANCYPROPERTY
.Jawaban:
Dari Grup Terbuka :
Jadi nama dapat berisi karakter apa pun kecuali = dan NUL, tetapi:
Jadi, meskipun nama-nama itu valid, shell Anda mungkin tidak mendukung apa pun selain huruf, angka, dan garis bawah.
sumber
[a-zA-Z_][a-zA-Z0-9_]*
(secara tersirat menyarankan formulir ini lebih waras), tetapi spesifikasi aktual (kutipan 1) memerlukan semua implementasi untuk mendukung apa pun kecuali=
danNUL
?Standar POSIX pada bagian shell dari IEEE Std 1003.1-2008 / IEEE POSIX P1003.2 / ISO 9945.2 Standar Shell dan Tools tidak mendefinisikan konvensi leksikal untuk nama variabel, namun pandangan sekilas pada sumber mengungkapkan bahwa ia menggunakan sesuatu yang mirip dengan
[a-zA-Z_]+[a-zA-Z0-9_]*
(Edit: Menambahkan garis bawah yang hilang di kelas karakter ke-2.)
Catatan singkat, karena beberapa shell tidak mendukung tanda + di regex, kemungkinan regex yang lebih portabel adalah:
[a-zA-Z_]{1,}[a-zA-Z0-9_]{0,}
sumber
[a-zA-Z_][a-zA-Z0-9_]*
Bagi mereka seperti saya yang menemukan referensi ke bash-4.1 sedikit kabur (616'000 baris kode), berikut adalah beberapa petunjuk untuk temukan baris kode yang relevan:subst.c: param_expand(), in the default case
->general.h:
/ * Tentukan dengan tepat apa yang dimaksud dengan pengidentifikasi shell hukum. * / #define legal_variable_starter (c) (ISALPHA (c) || (c == ' ')) #define legal_variable_char (c) (ISALNUM (c) || c == ' ')a word consisting solely of underscores, digits, and alphabetics from the portable character set. The first character of a name is not a digit
.Pengujian cepat saya menunjukkan bahwa mereka pada dasarnya mengikuti aturan yang sama seperti nama variabel C, yaitu
_
dan 0-9Jadi ini tidak termasuk
.
di dalamnya. Setiap nama variabel ilegal dikreditkan denganunknown command
.Ini diuji dalam ZSH, yang sebagian besar kompatibel dengan BASH.
sumber
Tergantung pada apa yang Anda maksud dengan 'diizinkan'.
Mengabaikan Windows untuk saat ini:
Lingkungan adalah array string, diteruskan ke fungsi utama suatu program. Jika Anda membaca exec (2), Anda tidak akan melihat persyaratan atau batasan pada string ini selain dari null-termination.
Secara konvensi, setiap string terdiri dari NAME = nilai. Tidak ada konvensi kutipan, jadi Anda tidak dapat memiliki '=' pada nama di konvensi ini.
Manusia normal mengatur string ini dengan mendiskusikannya dengan cangkangnya. Setiap shell memiliki ide sendiri tentang apa yang merupakan NAMA variabel yang valid, jadi Anda harus membaca halaman manual untuk shell-of-the-moment untuk melihat apa yang dipikirkannya.
Secara umum, hal-hal seperti com.baseball.spit = fleagh adalah properti sistem Java, dan apakah beberapa program Java bersedia untuk kembali ke lingkungan, lebih baik untuk menentukannya dengan -D.
sumber
Itu tergantung pada shell. Saya menduga Anda menggunakan bash secara default, dalam hal ini huruf, angka, dan garis bawah dibolehkan, tetapi Anda tidak dapat memulai nama variabel dengan angka. Pada Bash v.3, periode tidak diperbolehkan dalam nama variabel .
sumber
YA KAMU BISA MELAKUKANNYA.
Gunakan
exec
danenv
perintah untuk mengimplementasikan adegan ini.Tes Jadwal di Docker
Jalankan perintah dalam wadah:
Verifikasi variabel lingkungan:
Gunakan
ps aux
untuk memverifikasi PID tidak berubahGunakan
python
untuk memverifikasi variabel environmentemOUTPUT adalah
happy-variable-name
.Apa yang terjadi?
Cara lain
Jika Anda menggunakan buruh pelabuhan, Anda dapat mengatur variabel di Dockerfile
Jika Anda menggunakan kubernetes, Anda dapat mengatur variabel dengan ConfigMap
test.yaml
Sebarkan pod
kubectl apply -f test.yaml
Verifikasi
kubectl logs foobar
hasil:ConfigMap mengizinkan '-', '_' atau '.'
sumber
Meskipun sebagian besar shell tidak akan mengizinkan pengaturan variabel lingkungan (seperti yang disebutkan dalam jawaban lain), jika Anda membutuhkannya, Anda dapat menjalankan program lain dengan menggunakan variabel lingkungan yang tidak standar
env(1)
.Misalnya, menghapus semua lingkungan dan pengaturan
Strange.Env:Var
ke nilaifoo
, dan menjalankan program perl yang mencetaknya:akan dicetak
sumber