为什么输出的行为与ssh有所不同?

问题描述:

我通过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

您需要强制伪TTY分配:

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

虽然做ssh remote "somecommand",你在未绑定到任何终端的远程主机上产生非登录,非交互式shell会话l,所以没有工作控制。这就是为什么你只需要强制一个伪TTY分配。