Por que shell = True come meu subprocesso.Popen stdout?

Parece que usar shell = True no primeiro processo de uma cadeia de alguma forma descarta o stdout das tarefas downstream:

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

Fazer o primeiro processo usar shell = True mata a saída de alguma forma ...

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

shell = True no segundo processo não parece importar. Esse comportamento é esperado?

questionAnswers(1)

yourAnswerToTheQuestion