Los siguientes ejemplos muestran que se agrega una nueva línea a una cadena aquí .
¿Por qué se hace esto?
xxd -p <<<'a'
# output: 610a
xxd -p <<<'a
'
# output: 610a0a
fuente
Los siguientes ejemplos muestran que se agrega una nueva línea a una cadena aquí .
¿Por qué se hace esto?
xxd -p <<<'a'
# output: 610a
xxd -p <<<'a
'
# output: 610a0a
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 porzsh
, noksh
. Y fue inspirado por un operador similar en el puerto Unix delrc
cual no agregó ese carácter adicional de nueva línea. Curiosamente, el=(<<<text)
operador no agrega esa nueva líneazsh
.printf
, etc.) evitando la nueva línea de colabash
? Como @ StéphaneChazelas señaló es posible enzsh
.Un escenario en el que es práctico agregar nuevas líneas a las cadenas aquí es cuando se usa el
read
comando cuando elset -e
modo está activo. Recuerde queset -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 queread
genera un código de estado distinto de cero cuando encuentra una cadena sin líneas nuevas:fuente
Creo que esa es la única forma de obtener una nueva línea al final de una prueba aquí:
Parece que el operador here-string elimina las nuevas líneas a menos que se indiquen en la sintaxis que envió.
fuente
xxd <<<$(echo a)
.