Warum frisst shell = True meinen Subprozess.Popen stdout?

Es sieht so aus, als würde durch die Verwendung von shell = True im ersten Prozess einer Kette die Standardausgabe aus den nachgeordneten Tasks entfernt:

p1 = Popen(['echo','hello'], stdout=PIPE)
p2 = Popen('cat', stdin=p1.stdout, stdout=PIPE)
p2.communicate()
# outputs correctly ('hello\n', None)

Wenn Sie den ersten Prozess mit shell = True ausführen, wird die Ausgabe irgendwie abgebrochen ...

p1 = Popen(['echo','hello'], stdout=PIPE, shell=True)
p2 = Popen('cat', stdin=p1.stdout, stdout=PIPE)
p2.communicate()
# outputs incorrectly ('\n', None)

shell = True im zweiten Prozess scheint keine Rolle zu spielen. Ist das erwartetes Verhalten?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage