Respuestas:
La respuesta fácil es porque ksh está escrito de esa manera (y bash es compatible). Pero hay una razón para esa elección de diseño.
La mayoría de los comandos esperan entrada de texto. En el mundo de Unix, un archivo de texto consiste en una secuencia de líneas, cada una terminando en una nueva línea . Entonces, en la mayoría de los casos se requiere una nueva línea final. Un caso especialmente común es tomar la salida de un comando con una sustitución de comando, procesarlo de alguna manera y luego pasarlo a otro comando. La sustitución del comando elimina las nuevas líneas finales; <<<
pone uno de vuelta.
tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp
Bash y ksh no pueden manipular datos binarios de todos modos (no puede hacer frente a caracteres nulos), por lo que no es sorprendente que sus instalaciones estén orientadas a datos de texto.
La <<<
sintaxis here-string es principalmente solo por conveniencia de todos modos, como <<
here-documents. Si no necesita agregar una nueva línea final, use echo -n
(en bash) oy printf
una tubería.
<<<
fue introducido al mundo Bourne por zsh
, no ksh
. Y fue inspirado por un operador similar en el puerto Unix del rc
cual no agregó ese carácter adicional de nueva línea. Curiosamente, el =(<<<text)
operador no agrega esa nueva línea zsh
.
printf
, etc.) evitando la nueva línea de cola bash
? Como @ StéphaneChazelas señaló es posible en zsh
.
Un escenario en el que es práctico agregar nuevas líneas a las cadenas aquí es cuando se usa el read
comando cuando el set -e
modo está activo. Recuerde que set -e
hace que una secuencia de comandos finalice cuando (más o menos) encuentra declaraciones que generan un código de estado distinto de cero. Tenga en cuenta que read
genera un código de estado distinto de cero cuando encuentra una cadena sin líneas nuevas:
#!/bin/bash
set -e
# The following statement succeeds because here-strings append a newline:
IFS='' read -r <<< 'newline appended'
echo 'Made it here'
# The following statement fails because 'read' returns a non-zero status
# code when no newlines are encountered.
printf 'no newline' | IFS='' read -r
echo 'Did not make it here'
Creo que esa es la única forma de obtener una nueva línea al final de una prueba aquí:
xxd <<<`echo -ne "a\n"`
Parece que el operador here-string elimina las nuevas líneas a menos que se indiquen en la sintaxis que envió.
xxd <<<$(echo a)
.