Jawaban:
tail -n +3
mencetak inputnya, mulai dari baris 3 ( halaman manual ). $0
adalah nama skrip dalam skrip shell ( parameter khusus Bash ) dan exec
( Bash builtins ) menggantikan skrip dengan perintah. Anda mungkin memiliki sesuatu seperti ini (seperti /etc/grub.d/40_custom
pada sistem saya):
#!/bin/sh
exec tail -n +3 $0
foo
bar
Ketika Anda menjalankan skrip, itu menggantikan dirinya dengan tail
membaca skrip itu sendiri, sehingga sisa skrip akan disalin ke outputnya.
Saya pikir grub memiliki banyak skrip untuk membuat konfigurasi, mereka mungkin dieksekusi sebagai grubscript.sh >> grub-config-file
atau sesuatu untuk dilakukan. Script dapat menggunakan logika apa pun yang mereka butuhkan untuk menghasilkan output, tetapi exec tail
trik ini memungkinkan untuk hanya membuang beberapa jalur tetap dalam output tanpa mengubah logika script dimulai.
Selain mantra sihir itu, Debian /etc/grub.d/40_custom
juga menyertakan komentar yang memberi tahu pengguna
Cukup ketik entri menu yang ingin Anda tambahkan setelah komentar ini.
Jika Anda berbicara tentang /etc/grub.d/40_custom
:
$ cat /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
Kemudian perhatikan bahwa:
grub-mkconfig
untuk membangun konfigurasi GRUBTetapi ini adalah skrip shell, jadi biasanya Anda harus melakukan sesuatu seperti echo "menuentry ...."
dll. Untuk menghindari itu, exec tail
sihir digunakan. Apa fungsinya? $0
, ingat, adalah nama skrip yang dieksekusi, jadi biasanya skrip 40_custom
(atau /etc/grub.d/40_custom
, dll. tergantung di mana dan bagaimana skrip dijalankan). Jadi skrip pada dasarnya berjalan tail
dengan sendirinya, tetapi dengan -n +3
, yang memberitahu tail
mulai dari baris ketiga.
Apa yang Anda dapatkan jika Anda menampilkan semuanya dari baris ketiga dan seterusnya /etc/grub.d/40_custom
?
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
(Dan tambahan apa pun yang Anda masukkan di bawah ini.)
Bagian ini exec
menggantikan shell yang menjalankan skrip tail
, jadi secara efektif tidak ada lagi skrip yang dieksekusi.
Menjalankannya di terminal:
$0
mungkin bash
atau sesuatu seperti itu (bisa jadi /bin/bash
)exec
, Anda mengganti shell yang sedang berjalantail -n+3 bash
bash
di direktori Anda saat ini, tail
segera berhenti.Jadi hasil akhirnya kemungkinan sesi terminal Anda berakhir di sana.
#
adalah karakter komentar untuk grub anway,#!/bin/cat
harus bekerja juga. (Namun, Anda akan memiliki baris komentar shebang di output.)