创建自定义菜单项,被此命令卡住:
exec tail -n +3 $0在终端中尝试过,得到了奇怪的结果,无法理解,这个命令到底做了什么以及为什么grub需要它。你能解释一下吗?
发布于 2018-01-28 11:55:17
tail -n +3打印它的输入,从第3行(手册页)开始。$0是shell脚本(巴什特殊参数)中脚本的名称,exec (巴什建筑)用命令替换脚本。您可能有这样的东西(比如在我的系统上的/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还包括一条评论,告诉用户
只需键入要在此注释之后添加的菜单项即可。
发布于 2018-01-28 11:58:54
如果你说的是/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替换正在执行脚本的shell,因此有效地不再执行与脚本更远的内容。
在终端运行:
$0可能是bash或者类似的东西(可能是/bin/bash)exec,您要用tail -n+3 bash替换正在运行的shellbash的文件,所以tail立即退出。因此,最终的结果很可能是您的终端会话在那里结束。
https://unix.stackexchange.com/questions/420205
复制相似问题