使用 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.
中一样
在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我可以做到:
$ 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.
在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
不会发生变化。这就是为什么在这种情况下,我们使用采购而不是执行。