为什么python在我用echo管道代码而不是用cat管道时立即退出?

spr*_*aff 3 python bash echo cat python-3.x

#!/bin/bash

echo "print('Hello 1')" | python3

cat | python3 -u <<EOF
print('Hello 2')
EOF

echo "print('Hello 3')" | python3
Run Code Online (Sandbox Code Playgroud)

这输出

Hello 1
Hello 2
Run Code Online (Sandbox Code Playgroud)

在打印决赛之前,它会等我按回车键Hello 3.它也使用python的-u标志进行无缓冲输出.

为什么这样做cat但不是为了echo

Pau*_*ges 8

你没有用猫.你正在使用here-doc,cat正在等待输入.只需删除cat |并再次尝试.

echo "print('Hello 1')" | python3
python3 -u <<EOF
print('Hello 2')
EOF
echo "print('Hello 3')" | python3
Run Code Online (Sandbox Code Playgroud)

cat,你使用它的方式,将stdin传递给它的stdout,成为管道另一端的proc的stdin,但是你也定义了一个<<EOF优先的here-doc并忽略了它cat的空输出.

猫仍然在等待输入.一旦你点击返回它(通过OS魔术)尝试并意识到没有人正在监听管道,并退出.

顺便说一句,你也可以使用here-string,如下所示:

python3 <<< "print('Hello 2')"
Run Code Online (Sandbox Code Playgroud)