在使用 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)
/etc/os-release被设计为可采购的。只需使用:
. /etc/os-release; echo "$NAME"
Run Code Online (Sandbox Code Playgroud)
中的点. /etc/os-release告诉 shell获取该文件。这意味着文件中的命令将像在当前 shell 中一样运行。
在bash、zsh和ksh其他一些中,我们可以使用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。这就是为什么在这种情况下,我们使用采购而不是执行。