Answers:
tail -n +3
从第3行(手册页)开始打印其输入。$0
是Shell脚本(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配置但这是一个Shell脚本,因此通常您必须执行诸如此类的操作echo "menuentry ...."
。为避免这种情况,将使用exec tail
魔术。那是做什么的?$0
请记住,是执行脚本的名称,因此通常是40_custom
(或/etc/grub.d/40_custom
,等等,具体取决于运行位置和运行方式)。因此,该脚本实际上是tail
在其自身上运行的,但是带有-n +3
,它指示tail
从第三行开始。
如果从第三行开始输出所有内容,会得到什么/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
,您正在将运行中的shell替换为tail -n+3 bash
bash
您当前目录中可能没有命名的文件,因此请tail
立即退出。因此,最终结果很可能是您的终端会话在此结束。
#
是grub的注释字符,它也#!/bin/cat
应该起作用。(不过,输出中将包含shebang注释行。)