2012-03-16 14 views
20

Ho uno script di shell che sto eseguendo in Cygwin (forse questo è il problema). Per questo pezzo di codice, ho semplicemente voglia di scrivere la prima linea, e aggiungere un'interruzione di linea:Aggiunta di un'interruzione di riga a un file di output in uno script di shell

echo "`date` User `whoami` started the script." >> output.log 
echo >> output.log 

Ma il file output.log non sembra prendere la pausa. Se eseguo lo script più volte, è come se il secondo eco non scrivesse sul file.

Ho anche provato:

echo -e "`date` User `whoami` started the script.\n" >> output.log 

produce gli stessi risultati.

La cosa strana è che se inserisco semplicemente la seconda istruzione echo sopra la riga di comando, senza accodare il file, mi dà l'output previsto con l'interruzione di riga finale.

+0

Strano. Come si determina che le nuove righe non vengono aggiunte? –

+0

In realtà, ho appena visto che sembra che il programma in cui sto aprendo il log in non interpreti correttamente l'LF e si aspetti delle interruzioni di riga di Windows. Se sbaglio, sembra onorare le interruzioni. – Ode

risposta

24

Sto scommettendo il problema è che Cygwin sta scrivendo fine riga Unix (LF) al file, e si sta aprirlo con un programma che prevede terminazioni di linea Windows (CRLF). Per determinare se questo è il caso — e per un po 'di una soluzione hackish — prova:

echo "`date` User `whoami` started the script."$'\r' >> output.log 

(dove il $'\r' alla fine è un ritorno carrello supplementare, ma, più la linea Unix finale, si tradurrà in un finale di linea di Windows).

+0

Questo ha funzionato perfettamente.L'ipotesi sulle terminazioni di linea Unix vs Windows sembrava essere il problema – Ode

18

Prova:

echo "`date` User `whoami` started the script."$'\n' >> output.log 

o semplicemente:

echo $'\n' >> output.log 
+0

Si noti che la sostituzione di comando non viene eseguita in "$" ... "", in modo che la versione stamperà la stringa effettiva, i backtick e "date" e "whoami" e tutti, invece di eseguire 'date' e' whoami 'comandi. – ruakh

+0

@ruakh - Buona cattura. Non me ne sono accorto. Ho aggiornato la mia risposta. –

+0

Il "$" \ n "non ha funzionato, necessario per fare il" $ '\ r' dalla soluzione di ruakh. Grazie mille! – Ode

3

È possibile farlo senza un reindirizzamento I/O:

sed -i 's/$/\n/' filename 

È inoltre possibile utilizzare questo comando per aggiungere un ritorno a capo ad un elenco di file:

find dir -name filepattern | xargs sed -i 's/$/\n/' filename 

Per echo, alcune conchiglie implementalo come comando incorporato nella shell. Potrebbe non accettare l'opzione -e. Se si desidera ancora utilizzare echo, provare a trovare dove si trova il file binario echo utilizzando which echo. Nella maggior parte dei casi, si trova in /bin/echo, quindi è possibile utilizzare /bin/echo -e "\n" per echo una nuova riga.

2

Prova

echo -en "`date` User `whoami` started the script.\n" >> output.log 

Prova emissione questo più volte. Spero che tu stia cercando la stessa uscita.

Problemi correlati