grub2 配置中的命令“exec tail -n +3 $0”有什么逻辑?

grub2 配置中的命令“exec tail -n +3 $0”有什么逻辑?

创建自定义菜单条目,卡在这个命令上:

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 特殊参数) 和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还包含一条注释,告诉用户

只需在此评论后键入您要添加的菜单条目即可。

相关内容