2010-08-13 14 views
10

Estoy tratando de pasar una cadena que contiene una nueva línea a un script PHP a través de BASH.Cadena de tuberías con nueva línea al comando en bash?

#!/bin/bash 

REPOS="$1" 
REV="$2" 

message=$(svnlook log $REPOS -r $REV) 
changed=$(svnlook changed $REPOS -r $REV) 

/usr/bin/php -q /home/chad/www/mantis.localhost/scripts/checkin.php <<< "${message}\n${changed}" 

Cuando hago esto, veo el literal "\ n" en lugar de la nueva línea escapado:

blah blah issue 0000002.\nU app/controllers/application_controller.rb 

Alguna idea de cómo traducir '\ n' para una nueva línea literal?

Por cierto: ¿qué hace < < < hacer en bash? Sé < pases en un archivo ...

Respuesta

17

tratar

echo -e "${message}\n${changed}" | /usr/bin/php -q /home/chad/www/mantis.localhost/scripts/checkin.php 

donde -e permite la interpretación de la barra invertida se escapa (según man echo)

Tenga en cuenta que esto también interpretará barra invertida escapa que potencialmente tener en ${message} y en ${changed}.


Desde el manual de bash: Aquí Cuerdas

una variante de aquí documentos, el formato es:

<<<word 

La palabra se expande y se suministra al sistema en su entrada estándar.

así que diría que

the_cmd <<< word 

es equivalente a

echo word | the_cmd 
+0

¡Agradable! En realidad es -e en lugar de -a, pero eso es exactamente lo que estaba buscando. –

+0

sí, tienes razón, estaba pensando -escribiendo ... -corregiré esto. –

+0

'the_cmd <<< word' no es * bastante * equivalente a' echo word | the_cmd': '<<<' parece ser capaz de manejar cadenas más largas. –

3
newline=$'\n' 
... <<< "${message}${newline}${changed}" 

El <<< que se llama un "aquí cadena". Es una versión de una línea del "aquí documento" que no requiere un delimitador como "EOF". Esta es una versión aquí documento:

... <<EOF 
${message}${newline}${changed} 
EOF 
1

con el fin de evitar la interpretación de secuencias de escape potenciales en ${message} y ${changed}, tratar la concatenación de las cadenas en un subnivel (un salto de línea se añade después de cada echo a menos que se especifique la opción -n) :

(echo "${message}" ; echo "${changed}") | /usr/bin/php -q /home/chad/www/mantis.localhost/scripts/checkin.php 

los paréntesis se ejecutan los comandos en un subnivel (si no se han dado entre paréntesis, sólo la salida del segundo eco se canaliza en su programa php).

+0

"Para evitar ..." - eso se haría si usaras 'echo -e' –

Cuestiones relacionadas