使用 grep 捕获操作系统名称

Dav*_*542 2 grep sh

在使用 grep 时我可以这样做:

$ cat /etc/os-release|grep "NAME="
NAME="Ubuntu"
PRETTY_NAME="Ubuntu 14.04.3 LTS"
Run Code Online (Sandbox Code Playgroud)

有没有办法获取名称的捕获组?例如,类似:

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

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

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

在此输入图像描述

Joh*_*024 5

/etc/os-release被设计为可采购的。只需使用:

. /etc/os-release; echo "$NAME"
Run Code Online (Sandbox Code Playgroud)

中的点. /etc/os-release告诉 shell获取该文件。这意味着文件中的命令将像在当前 shell 中一样运行。

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

采购与执行

我们还可以执行该文件:

sh /etc/os-release; echo "$NAME"
Run Code Online (Sandbox Code Playgroud)

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