问题描述
$ lsb_release -c
Codename: trusty
$ cat /etc/issue
Ubuntu 14.04 LTS \n \l
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS"
以上命令的输出仅显示部分代码名称(即trusty
)。如何获得已安装的Ubuntu系统的完整代码名(可信任的tahr)?
最佳办法
不使用外部工具:
您可以仅使用/etc/os-release
的源代码(源命令是点.
),就可以访问在那里定义的所有变量:
$ . /etc/os-release
$ echo "$VERSION"
14.04, Trusty Tahr
编辑。如果要删除14.04,
零件(按terdon的要求),则可以:
$ . /etc/os-release
$ read _ UBUNTU_VERSION_NAME <<< "$VERSION"
$ echo "$UBUNTU_VERSION_NAME"
Trusty Tahr
请注意,这有点笨拙,因为在其他发行版上,VERSION
字段可以具有不同的格式。例如,在我的debian上,
$ . /etc/os-release
$ read _ UBUNTU_VERSION_NAME <<< "$VERSION"
$ echo "$UBUNTU_VERSION_NAME"
(wheezy)
然后,您可以想象这样的事情(在脚本中):
#!/bin/bash
if [[ -r /etc/os-release ]]; then
. /etc/os-release
if [[ $ID = ubuntu ]]; then
read _ UBUNTU_VERSION_NAME <<< "$VERSION"
echo "Running Ubuntu $UBUNTU_VERSION_NAME"
else
echo "Not running an Ubuntu distribution. ID=$ID, VERSION=$VERSION"
fi
else
echo "Not running a distribution with /etc/os-release available"
fi
次佳办法
我已经提供的变体:
. /etc/os-release; echo ${VERSION/*, /}
迄今为止最短,最差的答案。
如果您不希望将/etc/os-release
的内容加载到当前环境中,则可以假装bash认为它很容易加载脚本:
bash <(cat /etc/os-release; echo 'echo ${VERSION/*, /}')
第三种办法
Grep:
$ grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info | grep -m 1 "Description: Ubuntu " | cut -d "'" -f2
Trusty Tahr
说明:
-
lsb_release -rs
->打印已安装的Ubuntu版本。 -
grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info
->抓取包含您的发行版本的所有行,在我的情况下为14.04。 -
grep -m 1 "Description: Ubuntu "
->再次仅获取包含字符串Description: Ubuntu
的匹配的第一行(由于-m
标志)。 -
cut -d "'" -f2
->根据定界符单引号'
打印字段号2
Awk:
$ awk -v var=$(lsb_release -rs) '$3~var {print $4" "$5;exit;}' /usr/share/python-apt/templates/Ubuntu.info | cut -d"'" -f2
Trusty Tahr
说明:
在awk中声明和分配变量是通过-v
参数完成的,因此将lsb_release -rs
命令的值分配给变量var
,这反过来有助于从包含字符串14.04
的行中打印字段4,字段5,如果找到一个则存在。 cut
命令有助于删除单引号。
第四种办法
您要查找的命令是:
grep -oP '(?<=VERSION\=\"(\d\d)\.(\d\d)\,\ )(.*?)(?="$)' /etc/os-release
这非常丑陋,并且没有优化。我敢肯定应该有一个更简单的方法,这会有一些问题。