2012-03-12 58 views
2

我試圖修改現有的shell腳本來接受用戶輸入並處理一些系統導出。下面是一個更大腳本的摘錄。運行這個腳本後,我回顯$ TEST_DIR,並且我沒有收到任何迴應。有任何想法嗎?Bash Unix Shell腳本接受輸入並設置系統變量

#!/bin/sh 

if [ -z "$TEST_DIR" ] 
then 
    echo "TEST_DIR was not set, please enter the path: " 
    read input_variable 
    export TEST_DIR=$input_variable 
    exit 1 
fi 
+0

嘗試'源'文件名'。 – Gandaro 2012-03-12 18:22:44

+0

你正在退出,所以看起來你是在一個子shell中調用它,並且必須是變量不可見的原因。你怎麼調用它?在現有的shell中調用它,即通過加前綴。即代替使用myScript的使用。 myScript的。 – 2012-03-12 18:23:07

回答

2

另存爲script.sh

#!/bin/bash 

if [ -z "$TEST_DIR" ] 
then 
    echo "TEST_DIR was not set, please enter the path: " 
    read input_variable 
    export TEST_DIR=$input_variable 
fi 

,並運行它像這樣:

. ./script.sh 

,或等效:

source ./script.sh 

source運行在當前環境中的腳本,從而使您可以修改環境腳本。沒有它,每個命令(作爲shell進程的子進程運行)都只被賦予當前環境的副本。

注意我刪除了exit行,因爲它會在這種情況下終止shell。

1

問題是你在一個子shell中運行腳本 - 它正確設置你的TEST_DIR,但然後shell退出,並且父shell不保留更改。

你可能會更好地使這個函數可以從父shell獲得。 Shell腳本不能修改調用shell的環境,但函數可以修改它正在執行的shell。

1

你可能不想做exit 1;用於表示失敗。您將使用exit 0來指示成功—,但是,如下所述,在這種情況下,您也不想這樣做。

另一個問題是,如果將腳本作爲子進程運行,它不會影響父進程的環境。

要解決的是,在POSIX貝殼,你需要使用:

. your_script.sh 

,或者在bash,你也可以使用:

source your_script.sh 

腳本不必是可執行的,只是可讀,並將在$PATH上進行搜索,除非您指定一個包含斜槓的名稱,就像其他命令一樣。

而且,當您執行.source時,您肯定不希望腳本中有任何exit,因爲這會導致主shell退出。 shell讀取文件就好像你在標準輸入中輸入(或多或少),所以執行的exit將退出shell。