1

我有一个 bash 脚本myscript.sh

#!/bin/bash
while read line; do
    myprog.py
done

调用python程序myprog.py

#!/usr/bin/env python
import subprocess
output = subprocess.check_output(['ssh', 'user@host', 'cmd'])

子进程调用的ssh命令执行无误,输出正确。但是当像这样调用时,循环myscript.sh只运行输入的第一行,然后以状态 0 退出。如果我subprocess.check_output(...)用 a 替换调用subprocess.Popen(...)并且随后调用Popen.wait(),那么外部循环按预期工作,ssh命令的输出是在 bash 脚本的任何输出之后的一段时间内转储到标准输出。with 的Popen.wait()行为与 with 相同check_output:bash 循环在退出之前只经过一次迭代而不会出错。

如果不是调用ssh另一个命令,例如lscheck_output则 bash 循环按预期工作。

谁能帮我理解为什么显示的代码没有按预期工作?

注意:这是我正在尝试做的简化版本,尽管我确实遇到了与此代码相同的行为。实际上,我在 bash 脚本中使用“$line”做一些事情,并且子进程调用包含在try/except块中。

4

1 回答 1

2

正如@larsmans 猜测的那样,该ssh调用正在消耗标准输入,从而打破了外部 bash 循环。将-n选项添加到ssh命令解决了该问题:

output = subprocess.check_output(['ssh', '-n', 'user@host', 'cmd'])
于 2013-03-28T23:30:20.317 回答