カスタムメニューエントリを作成しています。次のコマンドで行き詰まっています:
exec tail -n +3 $0
ターミナルで試してみましたが、奇妙な結果になり、理解できません。このコマンドが正確に何をするのか、なぜgrubがそれを必要とするのか理解できません。説明して頂けますか?
tail -n +3
は、入力を3行目から出力します( man page )。 $0
はシェルスクリプト内のスクリプトの名前( Bashの特別なパラメーター )であり、exec
( Bash builtins )はスクリプトをコマンド。あなたはおそらくこのようなものを持っています(私のシステムの/etc/grub.d/40_custom
のように):
#!/bin/sh
exec tail -n +3 $0
foo
bar
スクリプトを実行すると、スクリプト自体がtail
に置き換えられ、スクリプト自体が読み取られるため、スクリプトの残りの部分が出力にコピーされます。
Grubにはその設定を作成するためのスクリプトがたくさんあると思います。それらはおそらくgrubscript.sh >> grub-config-file
または何かを実行するために実行されます。スクリプトは、出力を生成するために必要な任意のロジックを使用できますが、exec tail
トリックを使用すると、スクリプトの開始時のロジックを変更せずに、出力の固定行をダンプできます。
その魔法の呪文に加えて、Debianの/etc/grub.d/40_custom
には、ユーザーに
このコメントの後に追加するメニューエントリを入力するだけです。
/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構成を構築しますただし、これはシェルスクリプトであるため、通常はecho "menuentry ...."
などのようにする必要があります。これを回避するには、exec tail
マジックを使用します。それは何をしますか? $0
は、実行されたスクリプトの名前であるため、通常は40_custom
(または/etc/grub.d/40_custom
など、実行された場所と方法によって異なります)です。そのため、スクリプトは基本的にtail
をそれ自体で実行していますが、-n +3
を使用してtail
に3行目から開始するように指示しています。
/etc/grub.d/40_custom
の3行目以降をすべて出力すると何が得られますか?
# 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
はすぐに終了します。したがって、最終結果は、ターミナルセッションがそこで終了した可能性があります。