簡體   English   中英

如何從 bash 中的文件打印環境變量(不使用源)?

[英]How to print env var from file in bash (without using source)?

許多 shell 腳本,包括 bash 配置文件,只是環境變量設置的列表。 Debian 上的一個這樣的腳本是/etc/os-release ,如下所示:

PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

VERSION_CODENAME對於添加到 apt 源 ( /etc/apt/sources.list ) 尤其有用,例如Steam 在 ChromeOS 上工作 請注意,大多數指令都會硬編碼此值,這可能會導致兼容性問題。

所以我的問題是如何在使用source的情況下從/etc/os-release之類的文件中echo顯諸如VERSION_CODENAME之類的環境變量? 這很關鍵,因為我不想一次性使用這些環境變量來混淆我的環境變量。

這是我知道我現在可以做的,但它在我當前的環境中留下了不受歡迎的變量:

source /etc/os-release && echo "deb http://httpredir.debian.org/debian/ $VERSION_CODENAME main contrib non-free | sudo tee -a /etc/apt/sources.list"

我想也許有一種方法可以啟動一個新的(臨時)bash 進程並將變量加載到該環境中。 如果沒有實際的 shell 腳本,我無法弄清楚這一點。

這里有4個不同的答案...

對不起,但方法不止一種;)。 您可能會找到很多其他方法,但有最合適的(快速、高效、占用空間、可讀性......)。

1. 通過sed導入以填充關聯數組

declare -A IMPORTED="($(sed < /etc/os-release 's/^\([^=]\+\)=/[\1]=/'))"

然后

echo ${IMPORTED[VERSION_CODENAME]}
buster

2.提取必填字段(再次使用sed

AltVersionCodename=$(sed </etc/os-release -ne 's/^VERSION_CODENAME=//p')
echo $AltVersionCodename
buster

3.括號下拉到subshell使用他自己的環境

( . /etc/os-release ; echo $VERSION_CODENAME )
buster

echo $VERSION_CODENAME
 

當前環境不知道$VERSION_CODENAME

4.在純bash中讀取變量文件,沒有fork

由於我們正在處理一個小文件,我們可以使用循環來讀取文件,直到找到所需的信息:

while IFS== read varname value;do
    [ "$varname" = "VERSION_CODENAME" ] &&
        ImportedVersionCodename=$value && break
done </etc/os-release
echo $ImportedVersionCodename 
buster

我想也許有一種方法可以啟動一個新的(臨時)bash 進程並將變量加載到該環境中。

這就是使用括號創建子外殼的作用。

(
  . /etc/os-release
  echo "deb http://httpredir.debian.org/debian/ $VERSION_CODENAME main contrib non-free" \
  | sudo tee -a /etc/apt/sources.list
)

...一旦)被擊中,您的變量就會被刪除,因為它們被加載到退出的子shell中。

或者像這樣使用readprintf

while read line; do
    name=${line%%=*}
    data=${line#*=}
    printf -v $name "${data//\"}"
done < vars

下一個 function 僅獲取帶有鍵的行(單引號中的值)。

my_set() {
   configfile="$1"
   key="$2"
   print -v "$key" $(sed -n "s/^${key}=//p" "${configfile}")
}
my_set /etc/os-release VERSION_CODENAME
echo "deb http://httpredir.debian.org/debian/ $VERSION_CODENAME main.."

當您不需要環境中的 var 時,請使用

my_set2() {
   configfile="$1"
   key="$2"
   sed -n "s/^${key}=//p" "${configfile}"
}

echo "deb http://httpredir.debian.org/debian/ $(my_set2 /etc/os-release VERSION_CODENAME) main.."

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM