使用 grep 捕获 os 名称

Using grep to capture os name

使用grep我可以做到:

$ cat /etc/os-release|grep "NAME="
NAME="Ubuntu"
PRETTY_NAME="Ubuntu 14.04.3 LTS"

有没有办法得到名字的捕获组?例如,类似于:

$ cat /etc/os-release|grep -P '^NAME="(.+)"$'
NAME="Ubuntu" # <-- how to just get 'Ubuntu' ?

我想一个选择是这个?但这似乎有点矫枉过正:

$ cat /etc/os-release|grep -P '(?<=^NAME=")[^"]+'

/etc/os-release 旨在采购。只需使用:

. /etc/os-release; echo "$NAME"

. /etc/os-release 中的点告诉 shell 来源 文件。这意味着文件中的命令将是 运行,就像它们在当前 shell.

中一样

bashzshksh等中,我们可以用source /etc/os-release代替. /etc/os-release。但是,source 关键字不是 POSIX 标准的一部分,因此不可移植。特别是,dash 不支持 source,并且 dash 是许多发行版中的默认值 /bin/sh

采购与执行

我们也可以执行文件:

sh /etc/os-release; echo "$NAME"

然而,这意味着 /etc/os-release 中的命令在子进程中执行,当子进程退出时,所有环境更改将立即丢​​失。这意味着,在我们的过程中,变量NAME不会发生变化。这就是为什么在这种情况下,我们使用采购而不是执行。