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 bashbash您当前目录中可能没有命名的文件,因此请tail立即退出。因此,最终结果很可能是您的终端会话在此结束。
#是grub的注释字符,它也#!/bin/cat应该起作用。(不过,输出中将包含shebang注释行。)