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


8

创建自定义菜单项时,此命令卡住了:

exec tail -n +3 $0

在终端中对其进行了尝试,得出了奇怪的结果,无法理解,该命令的确切作用以及为何grub需要它。你能解释一下吗?

Answers:


10

tail -n +3从第3行(手册页)开始打印其输入。$0是Shell脚本(Bash特殊参数)中的脚本名称,而execBash 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还包含一条注释,告诉用户

只需在此注释后键入要添加的菜单项即可。


FWIW hard着眼睛,假设这#是grub的注释字符,它也#!/bin/cat应该起作用。(不过,输出中将包含shebang注释行。)
Ulrich Schwarz,

11

如果您在谈论/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部分用替换执行脚本的外壳tail,因此实际上没有执行任何脚本。


在终端中运行它:

  • $0可能是bash或类似的东西(可能是/bin/bash
  • 并且由于exec,您正在将运行中的shell替换为tail -n+3 bash
  • 并且由于bash您当前目录中可能没有命名的文件,因此请tail立即退出。

因此,最终结果很可能是您的终端会话在此结束。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.