Bash 使用T形三通时如何输入标准输入

Bash 使用T形三通时如何输入标准输入,bash,tee,Bash,Tee,我通常使用tee将程序保存到其他文件,例如 python -c "print('haha');" | tee -a /tmp/tmp.txt 但是,当程序需要从stdin读取数据时,这无法工作 python -c "print('haha');import pdb; pdb.set_trace()" | tee -a /tmp/tmp.txt 程序将挂在那里而不打印任何内容。如何应对?谢谢…我不是python专家,但您需要刷新管道程序的输出,否则您的“哈哈”会卡在输出缓冲区中。试试: pyt

我通常使用tee将程序保存到其他文件,例如

python -c "print('haha');" | tee -a /tmp/tmp.txt
但是,当程序需要从stdin读取数据时,这无法工作

python -c "print('haha');import pdb; pdb.set_trace()" | tee -a /tmp/tmp.txt

程序将挂在那里而不打印任何内容。如何应对?谢谢…

我不是python专家,但您需要刷新管道程序的输出,否则您的“哈哈”会卡在输出缓冲区中。

试试:

python -c "print('haha');import pdb, sys; pdb.Pdb(stdout=sys.stderr).set_trace()" | tee -a /tmp/tmp.txt
或者,如果您在Linux上:

stdbuf -o0 python -c "print('haha');import pdb, sys; pdb.set_trace()" | tee -a /tmp/tmp.txt
在上面的第一种情况下,
pdb
被指示将其输出发送到stderr。这意味着它不会进入
tee
,而是直接进入终端

在第二种情况下,
stdbuf
实用程序用于关闭输出缓冲
stdbuf
是GNU coreutils的一部分

改进版 当上述代码运行时,当pdb的stdout不是tty时,其行为会有所不同。特别是,它不支持pdb的所有交互式命令行功能,例如控制键。正如blueyed所指出的,能够克服这一点,因此程序运行时就像其标准输出没有被重新定向一样:

script -q -c 'python -c "import pdb, sys; pdb.set_trace()"' /dev/null | tee -a /tmp/tmp.txt

你知道为什么光标键在这种模式下不工作吗?输入被逐字显示为
^[[A
这也适用于
Ctrl-A
,显示为
^A
。发生在
python-c“import pdb;pdb.set_trace()”| tee/tmp/tmp.txt
。@blueyed我看到了同样的行为。目前,我没有解决办法。对我有效:
script-q-c'python-c“在Linux上导入pdb,sys;pdb.set_trace()”/dev/null | tee-a/tmp/tmp.txt