2015-10-16 66 views
2

我執行本地腳本,它通過SSH執行第二腳本:退出不是內部函數工作在SSH的腳本

RES=$(ssh [email protected] 'bash -s 2>&1' < remoteScript.sh) 

我需要第二個腳本(remoteScript.sh)代碼爲1時退出我發現一個錯誤,這就是爲什麼我建造了一些微妙的計算後執行的功能:

ErrorCheck() 
{ 
    if [ ! "$?" = "0" ] 
    then 
      exit 1 
    fi 
} 

不幸的是,1號出口表現爲返回指令,作爲remoteScript.sh繼續執行。根據我的測試,這與在遠程腳本開頭使用sudo su - {user}有關。

我在這裏做錯了什麼?我怎樣才能做到這一點,結束remoteScript.sh?

編輯:

我加入我的遠程腳本非常有限的例子。我試過在本地運行它,它工作。它通過SSH運行時失敗。

sudo su - {user} 
DelicateFunction() 
{ 
    # The following instruction fails 
    thisisanerror123 
    ErrorCheck 
} 
ErrorCheck() 
{ 
    if [ ! "$?" = "0" ] 
    then 
      exit 1 
    fi 
} 
printf "Executing DelicateFunction\n" 
DelicateFunction 
printf "I should not print!" 
+0

你能告訴你如何調用'ErrorCheck'?我的猜測是你在一個子外殼或者一個管道中執行它,它隱式地創建了一個子外殼。 –

+2

請創建一個演示問題的[mcve]。所寫的功能很好,所以周圍的環境出了問題。我們來看看一個顯示錯誤的自包含示例腳本。 –

+1

不只是不需要,但不能保證工作。 POSIX字符串相等運算符是'='。 – chepner

回答

1

不會退出的唯一方法是它是否在子shell中運行。 exit保證退出它的shell。

順便說一句,你可以寫ErrorCheck簡單了很多:

ErrorCheck() 
{ 
    [ $? = 0 ] || exit 1 
} 
+0

我知道這個問題來自我在腳本開頭使用sudo su - {user}的事實。如果我不切換用戶,該功能按預期工作。問題是我不允許直接使用該用戶進行連接。我總是強迫在腳本中切換它。 –