创建自定义菜单条目,卡在这个命令上:
exec tail -n +3 $0
在终端中尝试过,得到了奇怪的结果,无法理解这个命令到底做了什么以及为什么 grub 需要它。请你解释一下好吗?
答案1
如果你谈论的是/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.
然后注意:
- 这是一个 shell 脚本,用于
grub-mkconfig
构建 GRUB 配置 - 这个文件应该是“添加自定义菜单条目的简单方法”——您只需准确地输入您想要的任何 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
部分将执行脚本的 shell 替换为tail
,因此实际上不会执行脚本之外的任何内容。
在终端中运行它:
$0
可能是bash
或类似的东西(可能是/bin/bash
)- 由于
exec
,您将正在运行的 shell 替换为tail -n+3 bash
bash
并且由于您当前目录中可能没有指定的文件,因此tail
请立即退出。
所以最终结果很可能是您的终端会话在那里结束。
答案2
tail -n +3
从第 3 行开始打印其输入(手册页)。$0
是 shell 脚本中脚本的名称 (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
还包含一条注释,告诉用户
只需在此评论后键入您要添加的菜单条目即可。