Membuat entri menu kustom, terjebak pada perintah ini:
exec tail -n +3 $0
Mencobanya di terminal, mendapat hasil yang aneh, tidak bisa mengerti, apa perintah ini sebenarnya dan mengapa grub membutuhkannya. Bisakah Anda jelaskan?
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.
#
adalah karakter komentar untuk grub anway,#!/bin/cat
harus bekerja juga. (Namun, Anda akan memiliki baris komentar shebang di output.)Jika Anda berbicara tentang
/etc/grub.d/40_custom
: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 skrip40_custom
(atau/etc/grub.d/40_custom
, dll. tergantung di mana dan bagaimana skrip dijalankan). Jadi skrip pada dasarnya berjalantail
dengan sendirinya, tetapi dengan-n +3
, yang memberitahutail
mulai dari baris ketiga.Apa yang Anda dapatkan jika Anda menampilkan semuanya dari baris ketiga dan seterusnya
/etc/grub.d/40_custom
?(Dan tambahan apa pun yang Anda masukkan di bawah ini.)
Bagian ini
exec
menggantikan shell yang menjalankan skriptail
, jadi secara efektif tidak ada lagi skrip yang dieksekusi.Menjalankannya di terminal:
$0
mungkinbash
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.
sumber