2014-04-25 90 views
0

我有一個shell腳本,爲我創建一個具有完整結構,git存儲庫等的項目...... 問題是我不能在執行考試。這是我的腳本的一個示例:在Mac OS X中正確退出shell腳本

read -p "Have you created the remote repository : $repo.git ? [y/n] " ok 
if [ $ok != "y" ]; then 
    echo "You must create the remote repository before." 
    exit 0; 
fi 

git init 
# Rest of the script... 

當我類型「n」作爲回答,則終端顯示此(對於非法國人,「操作terminée」是指「操作結束」):

You must create the remote repository before. 
logout 

[Opération terminée] 

我無法再使用它了。再次使用它的唯一方法是關閉選項卡並打開另一個。也許問題出在exit 0?如何正確退出腳本?

謝謝。

+0

你是如何調用腳本的?它是否在一個名爲'script.sh'的文件中,頂部帶有'0755' perms和'#!/ bin/sh',並且你正在用'./ script.sh'或'/ path/to/script來調用它。 sh'? – trojanfoe

+0

不,我在我的'.bash_profile'中有一個'init-project'函數,我把這個函數 – c4k

+0

它需要放在一個接受參數的shell腳本中,而不是詢問用戶。然後這將運行在* sub-shell *中,並且一切都會很好。 – trojanfoe

回答

6

由於這是從bash_profile運行的,所以exit 0實際上基於其上下文關閉了shell。通常情況下,腳本就是調用函數,所以它不會退出shell。例如,如果直接在shell中運行echo "hello world"; exit 0;,那麼它將關閉shell,因爲這是發生退出的上下文。

如@ mklement0所示,將exit 0替換爲return

+0

+1;在函數中,只需使用'return'而不是'exit'。 – mklement0

+0

完美,替換退出固定它!請添加它作爲答案,以便我可以接受它。 – c4k

0

你是在&後面某行的末尾背景的功能嗎?這將像sleep 1 &一樣工作,並且只有在您按Enter後纔會打印。過程結束時的輸出取決於外殼,但在Bash 4.2中看起來像這樣:

$ sleep 1 & 
[1] 11166 
$ # Just press Enter after more than a second 
[1]+ Done     sleep 1