回答:
tail -n +3
入力を3行目から印刷します(manページ)。$0
はシェルスクリプト内のスクリプトの名前(Bash特殊パラメーター)であり、exec
(Bashビルトイン)はスクリプトをコマンドに置き換えます。あなたはおそらくこのようなものを持っています(/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行目から開始するように指示されます。
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
すぐに終了します。したがって、最終結果は、ターミナルセッションがそこで終了した可能性があります。
#
そらして、grub anwayのコメントキャラクターであると想定しても機能する#!/bin/cat
はずです。(ただし、出力にはシバンコメント行があります。)