2016-04-24 147 views
-1

我通過SSH以兩種不同的方式執行函數foo.sh(它執行一些更復雜的事情,如執行多個python進程)。爲什麼輸出的行爲與ssh有所不同?

首先,通過以下方式(交互式shell):

ssh [email protected] 
./foo.sh 

這樣,我得到的所有輸出foo.sh的(錯誤和stdout)

然後,另一種方式:

ssh [email protected] "./foo.sh" 

這樣我就不會從任何子過程中得到任何輸出。這兩種方法有什麼區別?爲什麼stderr/stdout的行爲不同?

爲foo.sh一個例子是

#! /bin/bash 
./bar.py 

哪裏bar.py是

#! /usr/bin/python3 
from sys import stdout, stderr 
from time import sleep 

while True: 
    stdout.write("A\n") 
    stderr.write("B\n") 
    sleep(0.5) 
+0

請提供一些'foo.sh'的最小內容來重現您觀察到的行爲。 – merlin2011

+1

第一種方法是什麼?登錄到遠程服務器後,您是否在交互式shell中運行腳本? – chepner

+0

是的,第一種方法是使用交互式shell – cskama

回答

0

您需要強制僞TTY分配:

ssh -t [email protected] "./foo.sh" 

雖然做ssh remote "somecommand",你在未綁定到任何終端的遠程主機上產生非登錄,非交互式shell會話l,所以沒有工作控制。這就是爲什麼你只需要強制一個僞TTY分配。

相關問題