Bash Manual mengatakan (halaman manual, penekanan saya):
Ketika Bash memanggil perintah eksternal, variabel
$_
diatur ke pathname lengkap dari perintah dan diteruskan ke perintah itu di lingkungannya.
Dan ( Parameter Khusus ):
_
(
$_
, sebuah garis bawah.) Pada startup shell, setel ke pathname absolut yang digunakan untuk memanggil shell atau skrip shell yang dieksekusi seperti yang diteruskan dalam lingkungan atau daftar argumen. Selanjutnya, perluas argumen terakhir ke perintah sebelumnya, setelah ekspansi. Juga setel ke nama path lengkap yang digunakan untuk memanggil setiap perintah yang dieksekusi dan ditempatkan di lingkungan yang diekspor ke perintah itu. Saat memeriksa email, parameter ini menyimpan nama file email.
Di bash shell, saya menjalankan:
$ bash $ export | grep '_='
Menurut manual,
_
harus variabel lingkungan dari bash shell baru.export
seharusnya menampilkan semua variabel lingkungan dari bash shell baru, tetapi tidak menghasilkan_
. Jadi saya bertanya-tanya apakah_
variabel lingkungan dari bash shell baru?Sebenarnya di bash shell, hal yang sama terjadi
$ export | grep '_='
tidak menghasilkan apa-apa. Jadi saya bertanya-tanya apakah
_
pernah ada variabel lingkungan dari bash shell?Untuk perbandingan:
$ dash $ export | grep '_=' export _='/bin/dash'
Posting saya terinspirasi oleh komentar Mike dan balasan Stephane .
export
adalah builtin, tetapi jika Anda menggunakanprintenv _
, itu akan menunjukkan kepada Anda bagaimana itu dipanggil:/usr/bin/printenv
pada sistem ini.bash -c export | grep _=
(dari Bash), akan ditampilkan bagaimana shell induk menjalankanbash
perintah, meskipun$_
tidak disetel pada induknya.Jawaban:
Ya,
_
adalah variabel lingkungan dari shell Bash baru; Anda dapat melihatnya dengan menjalankandi dalam shell: yang menunjukkan isi dari lingkungan awal shell. Anda tidak akan melihatnya di shell pertama karena tidak ada shell sebelumnya untuk mengaturnya sebelum dimulai.
Memperluas
$_
di dalam Bash mengacu pada_
parameter khusus, yang memperluas argumen terakhir dari perintah sebelumnya. (Secara internal Bash menangani ini dengan menggunakan_
variabel shell, yang diperbarui setiap kali perintah diuraikan, tapi itu benar-benar detail implementasi. Ini "tidak diekspor" setiap kali perintah diurai. )export
Tidak muncul_
karena tidak variabel yang ditandai sebagai diekspor; Namun Anda dapat melihatnya di output dariset
.Dalam contoh pertama, shell Bash baru mem-parsing dan mengeksekusi perintah dalam file startupnya, jadi ketika berjalan
explore | grep '-='
,_
sudah ditimpa dan ditandai sebagai tidak diekspor.Dalam
dash
contoh, sepertinya tidak menjalankan file start-up, jadi Anda melihat variabel sebagai variabel lingkungan yang ditetapkan oleh Bash sebelum dijalankandash
.sumber
export | grep '_='
menghasilkan apa-apa? Di bash shell asli, mengapa tidaktr '\0' '\n' < /proc/$$/environ | grep _=
menghasilkan apa-apa?_
dikeluarkan dari lingkungan , dan bagaimana saya dapat mengekspornya kembali ke lingkungan ?export
tanpa argumen mendaftar semua variabel yang diekspor ._
bukan variabel, tetapi terdaftar sebagai parameter khusus .Agak membingungkan,
_
juga akan menjadi nama yang valid untuk suatu variabel , tidak seperti nama-nama parameter khusus lainnya. Setidaknya Bash 4.4 memungkinkan penugasan untuk itu, tanpa keluhan. Hanya saja tidak berguna karena efek khusus segera menimpa nilainya.sumber
_
sebagai variabel ;-). Secara efektif hanya menulis dan nilainya hilang dengan segera._
sebagai variabel, itulah sebabnya ia muncul di outputset
. Namun itu tidak dapat ditandai sebagai diekspor sejauh yang saya bisa tentukan.Tidak semua variabel shell ditandai sebagai diekspor seperti yang Anda lihat di output
declare -p
.Tidak masuk akal untuk
bash
menandai$_
sebagai diekspor karena secara otomatis menambahkan variabel ini ke lingkungan proses anak tetapi dengan nilai yang berbeda dari yang ada di shell (pada saat itu).Menampilkannya sebagai yang diekspor hanya akan membingungkan pengguna tentang apa yang akan terjadi dengan lingkungan perintah eksternal.
Semua "variabel runtime"
BASH*
tidak diekspor.sumber