2012-11-15 35 views
1

我有一個簡單的bash腳本:爲什麼bash腳本變量沒有保存?

#!/bin/bash 
JAVA_HOME=/usr 
EC2_HOME=~/ec2-api 
echo $EC2_HOME 
export PATH=$PATH:$EC2_HOME/bin 

我運行該腳本,像這樣

$ ./ec2 
/Users/user/ec2-api 

運行該腳本,併產生正確的輸出。

然而,當我現在嘗試訪問EC2_HOME變量,我得到什麼了:

$ echo $EC2_HOME 

我得到一個空字符串回來。我究竟做錯了什麼?

回答

4

執行下列操作之一來代替:

source ec2 

. ec2 

(注意.符號僅僅是source快捷方式)

說明:

  • 這是因爲./ec2實際上從您當前的shell衍生出一個子shell來執行腳本,並且子殼不會影響它所生成的父shell的環境。
  • 因此,EC2_HOME確實在子shell中設置爲/Users/user/ec2-api(類似地PATH環境變量也會在子shell中正確更新和導出),但這些更改不會傳播回您的父shell。
  • 使用source直接在當前shell中運行腳本而不產生子shell,因此所做的更改將保留。
  • (關於export的註釋:導出用於告訴從當前shell生成的新shell使用從當前shell導出的變量。因此,對於只在當前shell中使用的變量,它們不需要導出。 )
0

一個shell腳本永遠不能修改它們父項的環境。 解決您的問題,您可以使用點命令(。):

$ . ./ec2 

,並應工作。在cshell,這將是

% source ./ec2 

要了解更多關於炮彈和腳本,我最好的資源是迄今爲止Unix power tools