2010-08-13 16 views
10

Sto provando a passare una stringa contenente una nuova riga a uno script PHP tramite BASH.Stringa di tubazioni con newline da comandare in 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}" 

Quando faccio questo, vedo il letterale "\ n", piuttosto che il ritorno a capo sfuggito:

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

Delle idee come tradurre '\ n' per il ritorno a capo letterale?

A proposito: cosa fa < < < in bash? So < passaggi in un file ...

risposta

17

provare

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

dove -e consente l'interpretazione di backslash (secondo man echo)

Si noti che questo sarà anche interpretare backslash che potenzialmente avere in ${message} e in ${changed}.


Dal manuale bash: Qui Corde

una variante qui documenti, il formato è:

<<<word 

La parola è espansa ed alimentato al comando sull'ingresso standard.

Quindi direi

the_cmd <<< word 

è equivalente a

echo word | the_cmd 
+0

Bello! In realtà è -e piuttosto che -a, ma è esattamente quello che stavo cercando. –

+0

sì, hai ragione, stavo pensando -e ma scrivendo -a ... correggerò questo. –

+0

'the_cmd <<< word' non è * abbastanza * equivalente a' echo word | the_cmd': '<<<' sembra essere in grado di gestire stringhe più lunghe. –

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

Il <<< viene chiamato un "qui stringa". È una versione a una riga del "here doc" che non richiede un delimitatore come "EOF". Questa è una versione qui documento:

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

al fine di evitare l'interpretazione di eventuali sequenze di escape in ${message} e ${changed}, provare a concatenare le stringhe in una subshell (una nuova riga viene aggiunto dopo ogni echo a meno che non si specifica l'opzione -n) :

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

le parentesi eseguire i comandi in un sottoshell (se sono state date le parentesi, solo l'uscita del secondo eco sarebbe convogliato nel programma php).

+0

"Per evitare ..." - che si farebbe se si usasse 'echo -e' –