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

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

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

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今すぐ終了します。

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

答え2

tail -n +3行3から始めて入力を印刷します(マニュアルページ)。$0はシェルスクリプト内のスクリプトの名前です(Bash 特殊パラメータ)とexecBash 組み込み機能) スクリプトをコマンドに置き換えます。/etc/grub.d/40_custom私のシステムのように、次のようなものがあります。

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

スクリプトを実行すると、tailスクリプト自体を読み取ってスクリプトを置き換えるため、残りのスクリプトが出力にコピーされます。

grubscript.sh >> grub-config-file私の考えでは、grubには実行または影響を与える可能性のある設定を生成する多くのスクリプトがあると思います。スクリプトは出力を生成するために必要なすべてのロジックを使用できますが、このトリックを使用すると、exec tailスクリプトによって開始されたロジックを変更せずに、出力からいくつかの固定行のみをダンプできます。

この魔法の呪文に加えて、Debian には/etc/grub.d/40_customユーザーに通知するメモも含まれています。

この説明の後に追加したいメニュー項目を入力するだけです。

関連情報