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 yangbash
diterima , lalubash
membiarkannya tidak tersentuh.Khususnya, jika
bash
shell dipanggil olehbash
lain shell (meskipunzsh
,yash
dan beberapaksh
implementasi juga melakukan
itu), makabash
shell akan mengatur_
environment
variabel ke jalur perintah yang dieksekusi (itulah poin ke-3
dalam pertanyaan Anda). Misalnya, jikabash
dipanggil untuk
menafsirkan skrip sebagai hasil daribash
. lainnya interpretasi shell:bash-script some args
bash
. itu akan melewati_=/path/to/bash-scrip
di lingkungan
yang diberikan kebash-script
, dan itulah nilai awal
dari$_
bash
variabel akan berada dibash
shell 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/bash
atau/path/to/some-script
atau yang lainnya (dalam contoh di atas, yang
akan menjadi/bin/bash
jika she-bang dari skrip adalah#! /bin/bash
atau/path/to/bash-script
tergantung pada
sistem).Sehingga teks tersebut menyesatkan karena menggambarkan perilaku
penelepon yangbash
tidak memiliki kendali atas. Aplikasi yang memanggilbash
mungkin 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
(misalnyaksh93
set 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.bashrc
misalnya.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_ENV
atau kode yang diumpankan ke shell itu jika$BASH_ENV
tidak
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>