Logika apa yang dimiliki perintah “exec tail -n +3 $ 0” dari grub2 config?

8

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?

Imajou
sumber

Jawaban:

10

tail -n +3mencetak inputnya, mulai dari baris 3 ( halaman manual ). $0adalah 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_custompada sistem saya):

#!/bin/sh
exec tail -n +3 $0
foo
bar

Ketika Anda menjalankan skrip, itu menggantikan dirinya dengan tailmembaca 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-fileatau sesuatu untuk dilakukan. Script dapat menggunakan logika apa pun yang mereka butuhkan untuk menghasilkan output, tetapi exec tailtrik ini memungkinkan untuk hanya membuang beberapa jalur tetap dalam output tanpa mengubah logika script dimulai.

Selain mantra sihir itu, Debian /etc/grub.d/40_customjuga menyertakan komentar yang memberi tahu pengguna

Cukup ketik entri menu yang ingin Anda tambahkan setelah komentar ini.

ilkkachu
sumber
FWIW, menyipit keras dan berasumsi #adalah karakter komentar untuk grub anway, #!/bin/catharus bekerja juga. (Namun, Anda akan memiliki baris komentar shebang di output.)
Ulrich Schwarz
11

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:

  • ini adalah skrip shell, dan dijalankan oleh grub-mkconfiguntuk membangun konfigurasi GRUB
  • file ini seharusnya menjadi "cara mudah untuk menambahkan entri menu kustom" - Anda cukup mengetikkan konfigurasi GRUB apa pun yang Anda inginkan.

Tetapi ini adalah skrip shell, jadi biasanya Anda harus melakukan sesuatu seperti echo "menuentry ...."dll. Untuk menghindari itu, exec tailsihir 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 taildengan sendirinya, tetapi dengan -n +3, yang memberitahu tailmulai 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 execmenggantikan shell yang menjalankan skrip tail, jadi secara efektif tidak ada lagi skrip yang dieksekusi.


Menjalankannya di terminal:

  • $0mungkin bashatau sesuatu seperti itu (bisa jadi /bin/bash)
  • dan karena itu exec, Anda mengganti shell yang sedang berjalantail -n+3 bash
  • dan karena Anda mungkin tidak memiliki nama file bashdi direktori Anda saat ini, tailsegera berhenti.

Jadi hasil akhirnya kemungkinan sesi terminal Anda berakhir di sana.

muru
sumber