入口在哪里
GRUB_DISTRIBUTOR=lsb_release -i -s 2> /dev/null || echo Debian
取自哪里的名字?
这就是为什么这不是“如何在 grub 启动菜单中安全地更改操作系统名称?”的重复:
我已经知道,可以通过注释来更改 GRUB 启动菜单中分配给操作系统的名称
GRUB_DISTRIBUTOR=lsb_release -i -s 2> /dev/null || echo Debian
并将条目替换为
GRUB_DISTRIBUTOR="Some other name"
(用引号括起来)。
我发现的所有解释都只是说:
GRUB_DISTRIBUTOR=lsb_release -i -s 2> /dev/null || echo Debian -
“此行只是检索菜单项中的名称。” 很公平!但我想知道:此命令从哪里检索实际名称?名称必须以纯文本形式包含在某个文件中!
答案1
如果我strace
命令lsb_release -i -s
...
strace -o strace.out lsb_release -i -s
我发现(从输出文件中strace.out
)它正在读取/etc/lsb-release
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"
的输出lsb_release -i -s
是Ubuntu
重定向2> /dev/null
会将命令中的任何错误发送到数据遗忘
该操作符||
的意思是当(且仅当)第一个命令失败时,才执行第二个命令:
first command || second command
因此,如果lsb_release -i -s
出现错误,错误将转到/dev/null
并执行命令echo Debian
。输出为Debian
总结一下:
如果lsb_release -s -i
能提供当前系统的名称,则使用该名称并显示输出。如果没有,则将其命名为“Debian”
该文件/etc/default/grub
用于生成 GRUB ( /boot/grub/grub.cfg
)update-grub
调用时读取的配置文件,因此在挂载真实根文件系统时会读取该文件。
您必须sudo update-grub
在编辑文件后运行才能使任何更改生效。
答案2
lsb_release是用于获取 Linux 发行版和版本(发行号)的内部命令。您可以复现该命令的工作原理以及它从何处获取信息。
在终端类型cat /proc/version
:
Linux version 4.7.3-040703-generic (kernel@tangerine) (gcc version 6.2.0 20160901 (Ubuntu 6.2.0-3ubuntu11) ) #201609070334 SMP Wed Sep 7 07:36:45 UTC 2016
Ubuntu出现在 /proc/version 中,但与 grub 菜单上的显示方式不同。因此我们继续...
现在输入cat /etc/issue
:
Ubuntu 16.04.1 LTS \n \l
这是哪里lsb_release可能会获取 Linux 发行版,因为Ubuntu 16.04.1 LTS就是在我的 grub 菜单上显示的内容。
在间接影响变量之前$GRUB_DISTRIBUTOR(在你的问题中引用)通过强制/etc/问题改为不同的常量,考虑以下代码/etc/grub.d/05_debian_theme
:
set_default_theme(){
case $GRUB_DISTRIBUTOR in
Tanglu|Ubuntu|Kubuntu)
# Set a monochromatic theme for Tanglu/Ubuntu.
echo "${1}set menu_color_normal=white/black"
echo "${1}set menu_color_highlight=black/light-gray"
改变Ubuntu到我的酷炫 Linux可能会出现在菜单上,但主题和颜色的内部 grub 代码可能会被破坏。更不用说 grub 内部以及您的其他应用程序和操作系统外部可能破坏的所有其他“东西”。
编辑1:
正如我今天早上了解到的显示 Linux 版本的命令然后发现@Zanna 上面已经给出了一个很好的答案,命令lsb_release从 检索文本/etc/lsb-release
。