Saya tahu env
adalah perintah shell, dapat digunakan untuk mencetak daftar variabel lingkungan saat ini. Dan sejauh yang saya mengerti, RANDOM
juga merupakan variabel lingkungan.
Jadi mengapa, ketika saya meluncurkan env
di Linux, apakah hasilnya tidak termasuk RANDOM
?
shell
environment-variables
mcmxciv
sumber
sumber
env
bukan perintah shell karena biasanya tidak dibangun ke dalam shell.declare -x
adalah setara dengan builtin shell.Jawaban:
RANDOM
bukan variabel lingkungan. Ini adalah variabel shell yang dikelola oleh beberapa shell. Biasanya tidak diekspor secara default. Inilah sebabnya mengapa itu tidak muncul di outputenv
.Setelah digunakan setidaknya sekali, itu akan muncul di output
set
, yang, dengan sendirinya, mencantumkan variabel shell (dan fungsi) dan nilainya dalam sesi shell saat ini. Perilaku ini tergantung pada shell dan digunakanpdksh
pada OpenBSD,RANDOM
akan terdaftarset
bahkan jika sebelumnya tidak digunakan.Sisa dari jawaban ini menyangkut apa yang bisa diharapkan terjadi jika
RANDOM
diekspor (yaitu diubah menjadi variabel lingkungan).Mengekspornya
export RANDOM
akan menjadikannya variabel lingkungan tetapi penggunaannya akan sangat terbatas karena nilainya dalam proses anak akan "acak tetapi statis" (artinya itu akan menjadi angka acak yang tidak berubah). Perilaku yang tepat berbeda antara shell.Saya menggunakan
pdksh
OpenBSD pada contoh di bawah ini dan saya mendapatkan nilai acak baru di setiap prosesawk
(tetapi nilai yang sama setiap kali dalam waktu yang samaawk
contoh yang ). Menggunakanbash
, saya akan mendapatkan nilai acak yang persis sama di semua doaawk
.Dalam
bash
, nilai yang dieksporRANDOM
akan tetap statis terlepas dari penggunaanRANDOM
di shell (di mana setiap penggunaan$RANDOM
masih akan memberikan nilai baru).Ini karena setiap referensi ke variabel shell
RANDOM
dibash
membuat shell mengaksesget_random()
fungsi internal untuk memberikan variabel nilai acak baru, tetapi shell tidak memperbarui variabel lingkunganRANDOM
. Hal ini mirip dalam perilaku seperti dengan dinamis lainnyabash
variabel, sepertiLINENO
,SECONDS
,BASHPID
dllUntuk memperbarui variabel lingkungan
RANDOM
dibash
, Anda harus menetapkan nilai variabel shellRANDOM
dan -ekspor ulang itu:Tidak jelas bagi saya apakah ini akan memiliki efek samping tambahan dari penyemaian ulang nomor acak generator di
bash
atau tidak (tapi tebakan yang berpendidikan adalah bahwa itu tidak).sumber
RANDOM
bahkan memiliki nilai sebelum Anda menggunakannya? Saya selalu menganggap itu hanya dihuni ketika dipanggil.export RANDOM
ataudeclare -p RANDOM
, itu muncul, jadi saya tidak yakin apakah ada gunanya itu tidak ada sebelum direferensikan ...Tidak semua variabel yang diatur dalam sesi shell Anda adalah variabel lingkungan. "Variabel lingkungan" hanya merujuk ke variabel yang telah diekspor ke lingkungan menggunakan
export
builtin. Theenv
perintah saja mencetak seperti lingkungan variabel. Sebagai contoh:Jika Anda ingin melihat semua variabel diatur dalam sesi Anda, terlepas dari apakah mereka telah diekspor, Anda dapat menggunakan
set
:The
set
builtin juga kembali fungsi, sehingga untuk melihat variabel saja, Anda dapat menggunakan:Akhirnya,
RANDOM
variabel khusus karena hanya diberi nilai saat Anda referensi. Ini disebutkan dalam bash (1) :Jadi, bahkan jika itu adalah variabel lingkungan seperti yang Anda pikirkan, itu tidak akan ditampilkan
env
karena tidak akan ditetapkan sampai pertama kali Anda menyebutnya. Itu juga mengapa itu tidak ditampilkan diset
:sumber
set | grep RAN
. Saya tidak akan menduganya. FWIW, saya percaya bahwa itu tidak dapat diprediksi oleh dokumentasi.Kebanyakan shell akan memiliki sejumlah variabel lain yang ditetapkan atau digunakan oleh shell yang tidak diekspor ke proses anak secara default.
Di Bash, ada beberapa yang jelas spesifik Bash:
Lalu ada lagi yang standar seperti
OPTIND
danOPTERR
(digunakan olehgetopts
), danPS2
,PS3
(permintaan sekunder) dan bahkan variabel "ajaib" lainnya:SECONDS
(menunjukkan waktu dalam detik sejak shell dimulai)Di Bash, Anda dapat melihat semua variabel dan status ekspornya
declare -p
. Yang ditandai dengan-x
diekspor, yang tanpax
tidak. (Beberapa akan memiliki flag lain sepertii
untuk integer ataur
hanya-baca.)Di Zsh atau ksh93, Anda dapat menggunakan
typeset -p
, meskipun Zsh menandai variabel yang diekspor dengan mengubahtypeset
keexport
dalam output, alih-alih menggunakan flag.export
dengan sendirinya juga akan menunjukkan semua variabel yang diekspor, tapi itu tentang hasil yang sama Anda dapatkan dengan menjalankanenv
.sumber
Jika Anda Google untuk ini, dokumen menyatakan sebagai berikut:
Jika Anda menggunakan,
strace
Anda dapat melihat bahwa$RANDOM
"variabel" diteruskan langsung ke perintah seolah-olah itu adalah variabel shell biasa atau variabel lingkungan, tapi itu hanya fungsi internal yang dibangun ke dalam shell, Bash, yang melakukan ekspansi.vs variabel reguler ini:
Variabel tidak diteruskan sebagai referensi.
Referensi
sumber
$RANDOM
atau$SOMEVAR
melalui argumen baris perintah, dan bukan sebagai variabel lingkungan? Anda harusexport
melewati keduanya melalui lingkungan.strace
Output tampaknya tidak menangkap fungsi internal yang dijalankan oleh shell. Dalam kedua kasus, variabel telah diperluas di baris pertamastrace
. Saya tidak mengerti apa yang Anda tunjukkan. Apa yang saya lewatkan?$RANDOM
ekspansi dilakukan secara internal ke shell. Ini pada dasarnya konfirmasi bahwa shell menentukan nilai, dan tidak meneruskan referensi ke variabel. Shell saat memperluas baris perintah untuk mengeksekusi parses$RANDOM
dan meneruskan formulir yang diperluasecho
.