カスタムメニュー項目を作成するには、次のコマンドで停止します。
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-mkconfig
GRUB構成を構築するためのシェルスクリプトです。- このファイルは「カスタムメニュー項目を追加する簡単な方法」と見なされます。必要な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 特殊パラメータ)とexec
(Bash 組み込み機能) スクリプトをコマンドに置き換えます。/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
ユーザーに通知するメモも含まれています。
この説明の後に追加したいメニュー項目を入力するだけです。