grub2 configからのコマンド「exec tail -n +3 $ 0」にはどのようなロジックがありますか?


8

カスタムメニューエントリを作成すると、次のコマンドが表示されなくなります。

exec tail -n +3 $0

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

回答:


10

tail -n +3入力を3行目から印刷します(manページ)。$0はシェルスクリプト内のスクリプトの名前(Bash特殊パラメーター)であり、execBashビルトイン)はスクリプトをコマンドに置き換えます。あなたはおそらくこのようなものを持っています(/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は、ユーザーに

このコメントの後に追加するメニューエントリを入力するだけです。


FWIWは、目を細めて目を#そらして、grub anwayのコメントキャラクターであると想定しても機能する#!/bin/catはずです。(ただし、出力にはシバンコメント行があります。)
Ulrich Schwarz

11

あなたが話しているなら/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にそれ自体で実行されていますが-n +3、を使用するとtail、3行目から開始するように指示されます。

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

したがって、最終結果は、ターミナルセッションがそこで終了した可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.