Saya setuju itu tidak terlalu jelas.
1. Pada startup shell,
jika _variabel berada di lingkungan yang bashmenerima , maka bashbiarkan tidak tersentuh.
Secara khusus, jika bashshell itu dipanggil oleh bash
shell lain (meskipun zsh, yashdan beberapa kshimplementasi juga melakukannya), maka bashshell itu akan mengatur _variabel lingkungan ke jalur perintah yang dieksekusi (itulah poin ke-3 dalam pertanyaan Anda). Misalnya, jika bashdipanggil untuk menafsirkan skrip sebagai akibat dari bashpenafsiran shell lain :
bash-script some args
Itu bashakan diteruskan _=/path/to/bash-scripdi lingkungan yang diberikan bash-script, dan itulah nilai awal dari $_ bashvariabel akan berada di bashshell yang menafsirkan skrip itu.
$ env -i _=whatever bash -c 'echo "$_"'
whatever
Sekarang, jika aplikasi yang menjalankan tidak melewati _variabel lingkungan , bashshell yang dipanggil akan diinisialisasi $_ke yang argv[0]diterimanya sendiri yang bisa menjadi bash, atau /path/to/bashatau
/path/to/some-scriptatau apa pun (dalam contoh di atas, itu akan menjadi /bin/bashjika she-bang dari skrip adalah #! /bin/bash
atau /path/to/bash-script tergantung pada sistem ).
Sehingga teks itu menyesatkan karena menggambarkan perilaku penelepon yang bashtidak memiliki kendali atas. Aplikasi yang dipanggil
bashmungkin tidak disetel $_sama sekali (dalam praktiknya, hanya beberapa shell dan beberapa aplikasi interaktif yang jarang dilakukan, execlp()tidak misalnya), atau dapat menggunakannya untuk sesuatu yang sama sekali berbeda (misalnya ksh93mengaturnya *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
The Selanjutnya tidak sangat jelas baik. Dalam praktiknya, itu segera bashmengartikan perintah sederhana di lingkungan shell saat ini.
Dalam kasus shell interaktif , itu akan menjadi perintah sederhana pertama yang ditafsirkan dari /etc/bash.bashrcmisalnya.
Sebagai contoh, 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 shell non-interaktif , itu akan menjadi perintah pertama di $BASH_ENVatau dari 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 lain akan melewatkan _variabel lingkungan ke perintah yang dijalankannya yang berisi jalur yang bashdigunakan sebagai argumen pertama ke execve()panggilan sistem.
$ env | grep '^_'
_=/usr/bin/env
4. Saat memeriksa surat
Poin keempat dijelaskan secara lebih rinci dalam deskripsi MAILPATHvariabel:
'MAILPATH'
Daftar nama file yang dipisahkan oleh titik dua dimana shell secara berkala memeriksa email baru .
Setiap entri daftar dapat menentukan pesan yang dicetak ketika surat baru masuk dalam file surat dengan memisahkan nama file dari pesan dengan '?'. Ketika 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>