2012-03-16 63 views
20

Tengo un script de shell que estoy ejecutando en Cygwin (quizás este es el problema). Para este trozo de código, simplemente quiero escribir la primera línea, y añadir un salto de línea:Agregar un salto de línea a un archivo de salida en un script de shell

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

Pero el archivo output.log nunca parece tomar el descanso. Si ejecuto el script varias veces, es como si el segundo eco no escribiera en el archivo.

También he intentado:

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

Se produce los mismos resultados.

Lo curioso es que si introduzco la segunda declaración de eco anterior en la línea de comandos, sin agregar al archivo, me da el resultado esperado con el salto de línea final.

+0

Extraño. ¿Cómo se determina que las nuevas líneas no se agregan? –

+0

En realidad, acabo de ver que parece que el programa que estoy abriendo el inicio de sesión no está interpretando correctamente el LF, y está esperando saltos de línea de Windows. Si obtengo el resultado, parece respetar los descansos. – Ode

Respuesta

24

Estoy apostando el problema es que Cygwin está escribiendo finales de línea Unix (LF) en el fichero, y que está abrirlo con un programa que espera finales de línea de Windows (CRLF). Para determinar si este es el caso — y por un poco de una solución hacker — intento:

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

(donde el $'\r' al final es un retorno de carro adicional, sino que, además de la línea de Unix que termina, se traducirá en un final de línea de Windows).

+0

Esto funcionó perfectamente.La hipótesis sobre finales de línea de Unix vs Windows parecía ser el problema – Ode

18

Probar:

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

o simplemente:

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

Tenga en cuenta que la sustitución de comandos no se realiza dentro de '$ '...'', por lo que la versión imprimirá la cadena, los palos y la "fecha" y "whoami" y todo, en lugar de ejecutar 'date' y' whoami 'comandos. – ruakh

+0

@ruakh - Buena captura. No me di cuenta de eso. Actualicé mi respuesta. –

+0

El "$ '\ n' no funcionó, era necesario para hacer el" $ '\ r' de la solución de ruakh. ¡Muchas gracias sin embargo! – Ode

3

Usted puede hacer eso sin un cambio de dirección de E/S:

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

También puede utilizar este comando para añadir una nueva línea en una lista de archivos:

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

Para echo, algunas conchas implementarlo como un comando de shell incorporado. Es posible que no acepte la opción -e. Si aún desea usar echo, intente encontrar dónde está el archivo binario echo, usando which echo. En la mayoría de los casos, se encuentra en /bin/echo, por lo que puede usar /bin/echo -e "\n" para repetir una nueva línea.

2

Trate

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

trate emitiendo esto varias veces. Espero que estés buscando el mismo resultado.

Cuestiones relacionadas