web-dev-qa-db-fra.com

Ajout d'un saut de ligne à un fichier de sortie dans un script Shell

J'ai un script Shell que j'exécute dans Cygwin (c'est peut-être le problème). Pour ce morceau de code, je veux simplement écrire la première ligne et ajouter un saut de ligne:

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

Mais le fichier output.log ne semble jamais faire de pause. Si j'exécute le script plusieurs fois, c'est comme si le deuxième écho n'écrivait pas dans le fichier.

J'ai aussi essayé:

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

Il donne les mêmes résultats.

La chose étrange est que si je viens d'entrer la deuxième instruction echo ci-dessus sur la ligne de commande, sans l'ajouter au fichier, cela me donne la sortie attendue avec le saut de ligne de fin.

25
Ode

Je parie que le problème est que Cygwin écrit des fins de ligne Unix (LF) dans le fichier, et vous l'ouvrez avec un programme qui attend les fins de ligne Windows (CRLF). Pour déterminer si tel est le cas - et pour un peu de solution de contournement hackish - essayez:

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

(où le $'\r' à la fin est un retour chariot supplémentaire; il, plus la fin de ligne Unix, se traduira par une fin de ligne Windows).

28
ruakh

Essayer:

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

ou juste:

echo $'\n' >> output.log
20
Daniel Haley

Essayer

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

Essayez d'émettre ce message plusieurs fois. J'espère que vous recherchez la même sortie.

3
Tanbir

Vous pouvez le faire sans redirection d'E/S:

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

Vous pouvez également utiliser cette commande pour ajouter une nouvelle ligne à une liste de fichiers:

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

Pour echo, certains shells l'implémentent comme une commande intégrée Shell. Il pourrait ne pas accepter le -e option. Si vous souhaitez toujours utiliser echo, essayez de trouver l'emplacement du fichier binaire echo, à l'aide de which echo. Dans la plupart des cas, il est situé dans /bin/echo, vous pouvez donc utiliser /bin/echo -e "\n" pour faire écho à une nouvelle ligne.

3
StarPinkER