Línea de comando: <<< en lugar de <<

63

¿Por qué el comando md5sum <<< 'ddd' (salida :) es d6d88f2e50080b9602da53dac1102762 -correcto y md5sum << 'ddd'no?

Que <<<significa

Jean Paulus
fuente

Respuestas:

45

Los <<<inicia una “cadena aquí”: la cadena se expande y se alimentan a la entrada estándar del programa. (En su caso, no está ocurriendo mucha expansión). Es equivalente a esto:

echo ddd | md5sum

Por otro lado, <<comienza un documento aquí. Todas las siguientes líneas hasta una que contenga el marcador dddcomprenderán la entrada del programa. (Debería usar un marcador que probablemente no aparezca en sus datos). Podría lograr el mismo efecto que el anterior de la siguiente manera:

md5sum <<END
ddd
END

Hay una diferencia entre <<ENDy <<'END': sin las comillas, cualquier variable, secuencia de escape, etc. en el documento aquí se expandirá como de costumbre.

chirlu
fuente
3
Donde no es equivalente es que, excepto en rc, <<<(like <<) utiliza un archivo temporal, por lo que puede ser utilizado por comandos que lseeksu stdin.
Stéphane Chazelas
32

<<<introduce una cadena aquí : la cadena posterior <<<se pasa como entrada al comando. Esto se origina en el puerto de Byron Rakitzis de rc(un shell del Plan 9) a Unix, y también está presente en zsh, ksh93 y bash.

<<introduce un documento aquí : las líneas posteriores del script de shell se pasan como entrada al comando y la cadena posterior <<es un terminador. Aquí los documentos funcionan en todos los shells de estilo Bourne (Bourne, POSIX, ash, bash, ksh, zsh, ...), shells de estilo C (csh, tcsh) y shells de Plan 9 (rc, es).

Gilles 'SO- deja de ser malvado'
fuente
3
No, <<<no es una kshextensión, la ruta es rc-> zsh-> ksh93-> bash(las kshnotas de la versión reconocen por una vez que toman prestada la función zsh). <<también funciona en rcconchas de estilo
Stéphane Chazelas
Hay una diferencia entre el rcy zsh <<<aunque en eso rcno incluye un carácter de nueva línea final y no usa un archivo temporal (usa una tubería y un proceso adicional que lo alimenta al menos en el puerto a Linux).
Stéphane Chazelas
Para ser más precisos, parece que <<<proviene del puerto Unix, rcya que no parece que el Plan9 lo rctenga.
Stéphane Chazelas