Bash
在 bash(或其他)中設置變數環境變數
我希望我的腳本讀取包含要設置的環境變數的鍵/值對的文件,然後設置它們。
到目前為止,我有這個:
#!/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
是受信任的來源,因此它不會對您的腳本造成不良影響。