¿Por qué shell = True come my subprocess.Popen stdout?

Parece que el uso de shell = True en el primer proceso de una cadena de alguna manera elimina la salida estándar de las tareas posteriores:

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

Hacer que el primer proceso use shell = True mata la salida de alguna manera ...

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

shell = Verdadero en el segundo proceso no parece importar. ¿Es este el comportamiento esperado?

Respuestas a la pregunta(1)

Su respuesta a la pregunta