Este es un comando canalizado para generar 10 caracteres de la contraseña al azar:¿Por qué termina esta tubería?
cat /dev/urandom | base64 | head -c 10
Mi pregunta es cat /dev/urandom | base64
es un flujo de salida infinito que no se detendrá por sí mismo. ¿Pero por qué anexar head -c 10
termina toda la tubería? Supongo que cat
, base64
y head
son 3 procesos separados, ¿cómo puede head
terminar el cat
?
Probablemente valga la pena mencionar que la única razón por la cual 'head' recibe alguna entrada es que' base64' escribe la salida después de obtener una cierta cantidad de entrada, es decir, cuando su buffer está lleno. Si fuera a leer hasta EOF, estaría leyendo para siempre, y 'head 'nunca conseguiría una grieta en nada de eso. Entonces, un canal similar, como 'cat/dev/urandom | suma | head -c 10' se comportaría de manera diferente, ya que 'sum' espera EOF. –
s/recibe errores de escritura/recibe SIGPIPE/ –
El comentario de Rob es * extremadamente * relevante. Si el proceso hereda un controlador SIGPIPE o ignora SIGPIPE (p. Ej., Si se ejecuta en el subproceso de intérpretes python más antiguo) y no verifica los errores de escritura, no finalizará. Hay una * gran * diferencia entre un error de escritura y recibir un SIGPIPE, y los programas que ignoran ambos problemas son propensos a ejecutarse indefinidamente. –