在使用 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 source 该文件。这意味着文件中的命令将像在当前 shell 中一样运行。
在bash
、zsh
、ksh
等中,我们可以使用source/etc/os-release
代替 。/etc/os-release
.然而,source
关键字不是 POSIX 标准的一部分,因此不可移植。特别是,dash
不支持 source
,并且 dash
是许多发行版上的默认 /bin/sh
。
采购与执行
我们还可以执行该文件:
sh /etc/os-release; echo "$NAME"
但是,这意味着 /etc/os-release
中的命令是在子进程中执行的,当子进程退出时,所有环境更改都会立即丢失。这意味着,在我们的过程中,变量NAME
不会发生变化。这就是为什么在这种情况下,我们使用采购而不是执行。
关于grep - 使用 grep 捕获操作系统名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62906289/