Bash

在 bash(或其他)中設置變數環境變數

  • March 13, 2022

我希望我的腳本讀取包含要設置的環境變數的鍵/值對的文件,然後設置它們。

到目前為止,我有這個:

#!/bin/bash

cat $1 | while read kv
do
   key=${kv%=*}
   val=`echo ${kv#*=} | sed 's/^"\|"$//g'`
   export $key="$val"
done

我想讀取這樣的文件:

XAUTHLOCALHOSTNAME="localhost"
DISPLAY=":0"
XAUTHORITY="/tmp/some-XAuthority"

在腳本執行期間,我只需要這些變數在作用域內,因此我不需要解決在腳本中為父作用域設置變數的問題。

從我的測試來看,我認為我的問題在於export $key="$val",所以我認為我只需要更換那條線。

export $key=$val應該可以正常工作bash。我懷疑你的問題是管道(|)。管道中的所有命令都在子 shell 中執行。在您的範例中,bash執行腳本的實例將分叉 2 個子外殼:一個cat $1用於while read .... 在執行while循環的子shell中分配和導出變數,然後在子shell退出時立即將它們全部拋出。解決此問題的一種方法是根本不生成子shell。不要無用地使用 cat,而是嘗試重定向:

while read ...; do
  ...
done < "$1"

BashFAQ 24更詳細地解釋了這一點。

另一種方法是僅獲取文件,並引入導出:

. <(sed '/^export/!s/^/export /' "$1")

<( )過程替換。

另外需要注意的是,由於您正在從參數中讀取環境變數,因此您必須確保參數文件$1是受信任的來源,因此它不會對您的腳本造成不良影響。

引用自:https://unix.stackexchange.com/questions/31797