Bisakah Anda menjelaskan kalimat berikut dari manual Bash tentang $_ , terutama bagian yang dicetak tebal, mungkin dengan beberapa contoh?
Saat memulai shell, setel ke nama path absolut yang digunakan untuk
memanggil skrip shell atau shell yang sedang dieksekusi sebagai diteruskan di lingkungan
atau daftar argumen .Selanjutnya , memperluas argumen terakhir ke perintah
sebelumnya, setelah perluasan.Juga disetel ke nama path lengkap digunakan untuk memanggil setiap
perintah yang dijalankan dan ditempatkan di lingkungan yang diekspor ke perintah itu .Saat memeriksa email , parameter ini menyimpan nama file email.
Jawaban yang Diterima:
Saya setuju itu tidak terlalu jelas.
1. Saat memulai shell,
-
jika
_variabel berada di lingkungan yangbashditerima , lalubashmembiarkannya tidak tersentuh.Khususnya, jika
bashshell dipanggil olehbashlain shell (meskipunzsh,yashdan beberapakshimplementasi juga melakukan
itu), makabashshell akan mengatur_environment
variabel ke jalur perintah yang dieksekusi (itulah poin ke-3
dalam pertanyaan Anda). Misalnya, jikabashdipanggil untuk
menafsirkan skrip sebagai hasil daribash. lainnya interpretasi shell:bash-script some argsbash. itu akan melewati_=/path/to/bash-scripdi lingkungan
yang diberikan kebash-script, dan itulah nilai awal
dari$_bashvariabel akan berada dibashshell yang
menginterpretasikan skrip tersebut.$ env -i _=whatever bash -c 'echo "$_"' whatever -
Sekarang, jika aplikasi yang memanggil tidak melewati
_lingkungan
variabel ,bash. yang dipanggil shell akan menginisialisasi$_keargv[0]ia menerima
dirinya sendiri yang dapat berupabash, atau/path/to/bashatau/path/to/some-scriptatau yang lainnya (dalam contoh di atas, yang
akan menjadi/bin/bashjika she-bang dari skrip adalah#! /bin/bashatau/path/to/bash-scripttergantung pada
sistem).Sehingga teks tersebut menyesatkan karena menggambarkan perilaku
penelepon yangbashtidak memiliki kendali atas. Aplikasi yang memanggilbashmungkin tidak menyetel$_sama sekali (dalam praktiknya, hanya beberapa
shell dan beberapa aplikasi interaktif langka yang melakukannya,execlp()tidak
misalnya), atau dapat menggunakannya untuk sesuatu yang sama sekali berbeda
(misalnyaksh93set ke*pid*/path/to/command).$ env bash -c 'echo "$_"' /usr/bin/env (env did not set it to /bin/bash, so the value we get is the one passed to env by my interactive shell) $ ksh93 -c 'bash -c "echo $_"' *20042*/bin/bash
2. Selanjutnya
Selanjutnya juga tidak terlalu jelas. Dalam praktiknya, itu segera setelah bash menafsirkan perintah sederhana di lingkungan shell saat ini.
-
Dalam kasus cangkang interaktif , yang akan menjadi perintah sederhana pertama yang ditafsirkan dari
/etc/bash.bashrcmisalnya.Misalnya, pada prompt shell interaktif:
$ echo "$_" ] (the last arg of the last command from my ~/.bashrc) $ f() { echo test; } $ echo "$_" ] (the command-line before had no simple command, so we get the last argument of that previous echo commandline) $ (: test) $ echo "$_" ] (simple command, but in a sub-shell environment) $ : test $ echo "$_" test -
Untuk cangkang non-interaktif , itu akan menjadi perintah pertama di
$BASH_ENVatau kode yang diumpankan ke shell itu jika$BASH_ENVtidak
disetel.
3. Saat Bash menjalankan perintah
Poin ketiga adalah sesuatu yang berbeda dan diisyaratkan dalam diskusi di atas.
bash , seperti beberapa shell lainnya akan melewati _ variabel lingkungan ke perintah yang dijalankannya yang berisi jalur yang bash digunakan sebagai argumen pertama untuk execve() panggilan sistem.
$ env | grep '^_'
_=/usr/bin/env
4. Saat memeriksa email
Poin keempat dijelaskan lebih detail dalam deskripsi MAILPATH variabel:
'MAILPATH'
Daftar nama file yang dipisahkan titik dua yang secara berkala diperiksa oleh shell
untuk email baru .Setiap entri daftar dapat menentukan pesan yang
dicetak saat email baru tiba di file email dengan memisahkan
nama file dari pesan dengan '?'.
Saat digunakan dalam teks pesan
, '$_' meluas ke nama file email saat ini.
Contoh:
$ MAILCHECK=1 MAILPATH='/tmp/a?New mail in <$_>' bash
bash$ echo test >> /tmp/a
New mail in </tmp/a>