Dlaczego shell = True je mój subprocess.Popen stdout?

Wydaje się, że użycie powłoki = True w pierwszym procesie łańcucha w jakiś sposób upuszcza standardowe wyjście z zadań niższego rzędu:

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

Wykonanie pierwszego procesu użyj powłoki = Prawdziwy zabija w jakiś sposób wyjście ...

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

shell = Prawda w drugim procesie nie ma znaczenia. Czy to oczekiwane zachowanie?

questionAnswers(1)

yourAnswerToTheQuestion