2012-03-16 7 views
20

Mam skrypt powłoki, który wykonuję w Cygwin (może to jest problem). Do tego kawałka kodu, ja po prostu chcę pisać pierwszą linię i dołączyć podział wiersza:Dołączanie wiersza do pliku wyjściowego w skrypcie powłoki

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

ale plik output.log nigdy nie wydaje się mieć przerwę. Jeśli uruchomię skrypt kilka razy, to tak, jakby drugie echo nie zapisało do pliku.

Próbowałem również:

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

daje ona takie same wyniki.

Dziwne jest to, że po prostu wpisuję drugą komendę echa powyżej w linii poleceń, bez dołączania do pliku, to daje mi oczekiwany wynik z końcowym łamaniem linii.

+0

Dziwne. Jak ustalić, czy nowe linie nie są dodawane? –

+0

Właściwie, po prostu patrzyłem na to, że program, w którym się loguję, nie interpretuje prawidłowo LF i oczekuje przerw w linii Windows. Jeśli wywnioskuję wynik, wydaje się, że honoruje przerwy. – Ode

Odpowiedz

24

założę problemu jest to, że pisze Cygwin Unix zakończeń linii (LF) do pliku, a ty otwarciem z programem, który oczekuje zakończenia linii systemu Windows (CRLF). Aby ustalić, czy jest to przypadek — i na kawałku hackish obejście — try:

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

(gdzie $'\r' na końcu jest dodatkowy wózek zwrotny; to, plus linia Unix kończąc, spowoduje w kończącym się wierszu systemu Windows).

+0

To działało idealnie.Wydaje się, że problemem była hipoteza o końcówkach linii Unix kontra Windows – Ode

18

Spróbuj:

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

lub po prostu:

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

Zauważ, że podstawianie poleceń nie jest wykonywane w '$ '...'' ', więc ta wersja będzie wypisywać rzeczywisty ciąg znaków, odciski i "date" oraz "whoami" i wszystkie, zamiast uruchamiać 'date' i' whoami 'polecenia. – ruakh

+0

@ruakh - Dobry połów. Nie zauważyłem tego. Zaktualizowałem swoją odpowiedź. –

+0

"$" \ n "nie działało, konieczne było wykonanie" $ '\ r "z rozwiązania firmy ruakh. Dziękuję bardzo! – Ode

3

Można to zrobić bez przekierowania I/O:

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

Można również użyć tego polecenia, aby dołączyć nową linię do listy plików:

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

Dla echo, niektóre muszle implementuj go jako polecenie wbudowane powłoki. Może nie zaakceptować opcji -e. Jeśli nadal chcesz używać echo, spróbuj znaleźć plik binarny echo, używając which echo. W większości przypadków znajduje się on pod numerem /bin/echo, dzięki czemu można użyć numeru /bin/echo -e "\n", aby wyświetlić nową linię.

2

Spróbuj

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

Spróbuj wydając ten kilka razy. Mam nadzieję, że szukasz tego samego produktu.