問題描述
$ 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
這非常醜陋,並且沒有優化。我敢肯定應該有一個更簡單的方法,這會有一些問題。