2016-12-06 61 views
1

我們有一個名爲source.sh的shell腳本,用於導出構建所需的許多ENV變量。環境變量不可用於shell腳本中的下一個命令

我想通過在腳本中運行source.sh來訪問這些ENV變量,但即使在運行之後,我也無法訪問後續命令的ENV變量。

我的腳本看起來很相像:

#!/bin/bash 

sh source.sh 
cd $ROOT_VOS 
make 

但這裏CD $ ROOT_VOSis沒有發生

+0

順便說一句,還有待使之成爲一個環境變量VS常規shell沒有很好的理由變量和POSIX約定指定要用於操作系統和shell的變量的全大寫變量名的名稱空間,小寫名稱保留供應用程序使用。 (形式上,這是爲環境變量指定的,但是設置常規shell變量會覆蓋任何類似命名的環境變量,所以公約必須在兩個地方應用)。 –

回答

1

sh source.sh

...運行source.shsh(實際上是一個獨立的副本,因爲你的母貝是bash,孩子是sh,它不只是一個「單獨的副本」,它是一個完全不同的解釋器)。當這個單獨的解釋器退出時,局部變量和其他處理本地狀態的變化都消失了。 (環境變量由子進程繼承;它們不會傳播到樹上父項)。


相反,使用:

# POSIX-compliant: execute every command in source.sh in the current shell 
. source.sh 

......或者......

# bash-specific, perhaps more-readable, synonym for the same 
source source.sh 
相關問題