grub2設定で "exec tail -n +3 $0"コマンドの後に隠されているロジックは何ですか?

grub2設定で

カスタムメニュー項目を作成するには、次のコマンドで停止します。

exec tail -n +3 $0

ターミナルで試してみましたが、奇妙な結果が出ており、このコマンドが正確に何をするのか、なぜ grub に必要なのか理解できません。説明してもらえますか?

ベストアンサー1

あなたが言うなら/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.

それから注意してください。

  • grub-mkconfigGRUB構成を構築するためのシェルスクリプトです。
  • このファイルは「カスタムメニュー項目を追加する簡単な方法」と見なされます。必要なGRUB設定を正確に入力するだけです。

ただし、これはシェルスクリプトなので、通常は次のことを行う必要がありますecho "menuentry ...."。これを防ぐためにexec tail魔法が使用されます。それが何をするのですか?$0は実行されるスクリプトの名前なので、通常は40_custom実行/etc/grub.d/40_custom場所と方法によって異なります。したがって、スクリプトは本質的にtailそれ自体で実行されますが、それを使用すると3行目から始めるように-n +3指示されます。tail

3行目からすべて印刷すると何が得られますか/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.

(また、この下に配置する他のコンテンツもあります。)

このexec部分はスクリプトを実行するシェルに代わるものであるため、スクリプトの外にあるtailものは実際には実行されません。


端末で実行します。

  • $0そうかもしれないしbash(おそらく/bin/bash
  • 後でexec実行しているシェルを次に置き換えます。tail -n+3 bash
  • bashそして、指定されたファイルが現在のディレクトリにない可能性があるので、tail今すぐ終了します。

したがって、最終結果は、端末セッションがそこで終了する可能性が最も高い。

おすすめ記事