首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自grub2配置的命令"exec -n +3 $0“有什么逻辑?

来自grub2配置的命令"exec -n +3 $0“有什么逻辑?
EN

Unix & Linux用户
提问于 2018-01-28 11:28:14
回答 2查看 2.9K关注 0票数 8

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

代码语言:javascript
复制
exec tail -n +3 $0

在终端中尝试过,得到了奇怪的结果,无法理解,这个命令到底做了什么以及为什么grub需要它。你能解释一下吗?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2018-01-28 11:55:17

tail -n +3打印它的输入,从第3行(手册页)开始。$0是shell脚本(巴什特殊参数)中脚本的名称,exec (巴什建筑)用命令替换脚本。您可能有这样的东西(比如在我的系统上的/etc/grub.d/40_custom中):

代码语言:javascript
复制
#!/bin/sh
exec tail -n +3 $0
foo
bar

当您运行该脚本时,它将自己替换为读取脚本本身的tail,因此脚本的其余部分被复制到其输出中。

我认为grub有一堆脚本来创建它的配置,它们可能是以grubscript.sh >> grub-config-file或其他什么方式执行的。脚本可以使用它们生成输出所需的任何逻辑,但是exec tail技巧允许只在输出中转储一些固定行,而不更改脚本启动时使用的逻辑。

除了这个神奇的咒语,Debian的/etc/grub.d/40_custom还包括一条评论,告诉用户

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

票数 10
EN

Unix & Linux用户

发布于 2018-01-28 11:58:54

如果你说的是/etc/grub.d/40_custom

代码语言:javascript
复制
$ 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的第三行开始输出所有内容,您会得到什么?

代码语言:javascript
复制
# 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替换正在运行的shell
  • 而且,由于您可能在当前目录中没有一个名为bash的文件,所以tail立即退出。

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

票数 11
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/420205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档