¿Hay alguna manera de hacer que bash no coma nuevas líneas en la sustitución de backtick?
Por ejemplo:
var=`echo line one && echo line two`
echo $var
line one line two
Lo que quiero es
var=`echo line one && echo line two` # plus some magic
echo $var
line one
line two
bash
realiza parámetros de expansión antes de ejecutar un comando, citando es necesario informarbash
que desea imprimir una sola cadena y no palabras (4line
,one
,line
ytwo
). Prueba:echo a <many spaces> b
yecho "a <many spaces> b"
. Echa un vistazo a esta respuesta también.Aunque @cyrus es correcto, en realidad no responde a toda la pregunta, y no hay una explicación de lo que está sucediendo.
Así que vamos a atravesarlo.
Nuevas líneas en cadena
Primero determine la secuencia de bytes que se espera:
Ahora, use la sustitución de comandos (Sección 3.5.4) para intentar capturar esta secuencia de bytes:
Luego, haga un eco simple para verificar la secuencia de bytes:
Parece que la primera línea nueva fue reemplazada por un espacio, y la segunda línea nueva quedó intacta. Pero por qué ?
Veamos lo que realmente está sucediendo aquí:
Primero, bash hará la expansión de parámetros de Shell (Sección 3.5.3)
Luego bash hará la división de palabras (Sección 3.5.7)
A continuación, bash lo tratará como un comando simple (Sección 3.2.1)
La definición de espacios en blanco (Sección 2 - Definiciones)
Finalmente, bash invoca el comando interno echo (Sección 4.2 - Bash Builtin Commands)
Para resumir, las nuevas líneas se eliminan mediante Word Splitting, y luego echo obtiene 2 args, "a" y "b", y luego los separa por espacios y termina con una nueva línea.
Al hacer lo que @cyrus sugirió (y suprimir la nueva línea del eco con -n), el resultado es mejor:
Líneas nuevas al final de la cadena
Sin embargo, todavía no es perfecto, la nueva línea final se ha ido. Mirando más de cerca la sustitución de comandos (Sección 3.5.4) :
Ahora que está claro por qué la nueva línea desaparece, se puede engañar a bash para que la conserve. Para hacer esto, agregue una cadena adicional al final y elimínela cuando use la variable:
TL; DR
Agregue una parte adicional al final de la salida y cite las variables:
fuente
Hubiera puesto mi pequeña adición en un comentario sobre la respuesta de cYrus, pero todavía no puedo comentar sobre las respuestas que creo. Así que duplicaré parte de cYrus su respuesta para completar.
Lo que sucede en la primera línea de su código es que, de hecho, la sustitución de backticks come las nuevas líneas finales de la salida del comando sustituido, como se documenta . Pero no se come la nueva línea entre sus dos líneas.
Lo que sucede en la segunda línea de código es que echo se ejecuta con dos argumentos, la primera y la segunda línea. Citar la variable expandida corregirá eso:
echo "$var"
Esto preservará la nueva línea entre su línea uno y la línea dos. Yecho
agregará una nueva línea final de forma predeterminada para que todo esté bien.Ahora, si desea conservar todas las nuevas líneas finales en la salida de alguna sustitución de comando, una solución alternativa es agregar otra línea a la salida, que puede eliminar después de la sustitución de comando, consulte aquí .
fuente