2012-03-16 999 views
20

我有一個在Cygwin中執行的shell腳本(也許這是問題)。對於這段代碼,我只是想寫的第一行,並追加一個換行符:將換行符附加到shell腳本中的輸出文件

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

但output.log文件似乎從來沒有采取休息。如果我多次運行該腳本,就好像第二個回顯不寫入文件。

我也試過:

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

它會產生相同的結果。

奇怪的是,如果我只是在命令行中輸入上面的第二個echo語句,而不追加到文件,它會給我預期的輸出和尾部換行符。

+0

奇怪。你如何確定新行不被添加? – 2012-03-16 17:03:01

+0

實際上,我只是看着它似乎打開日誌的程序沒有正確解釋LF,並期待Windows換行符。如果我捕捉輸出結果,它似乎要兌現休息時間。 – Ode 2012-03-16 18:41:33

回答

24

我打賭的問題是,Cygwin的是寫Unix行結尾(LF)的文件,你打開它預計Windows行結束(CRLF)的程序。要確定是否是這種情況—和有點hackish的解決辦法的—嘗試:

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

(其中$'\r'末是一個額外的回車;它,再加上Unix行結束,將導致在Windows行結尾)。

+0

這工作完美。關於Unix和Windows行結尾的假設似乎是問題 – Ode 2012-03-16 18:44:59

18

嘗試:

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

或者只是:

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

請注意,命令替換不在'$'...'內執行,因此版本將打印實際的字符串,反引號和「date」和「whoami」以及全部,而不是運行'date'和'whoami '命令。 – ruakh 2012-03-16 17:07:17

+0

@ruakh - 好。我沒有注意到這一點。我更新了我的答案。 – 2012-03-16 17:12:59

+0

「$'\ n'無效,需要從ruakh的解決方案中執行」$'\ r'。非常感謝! – Ode 2012-03-16 18:44:35

3

你可以做,沒有一個I/O重定向:

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

您還可以使用這個命令將換行符附加到文件列表:

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

對於echo,一些炮彈將其作爲shell內置命令來執行。它可能不接受-e選項。如果您仍想使用echo,請嘗試使用which echo來查找echo二進制文件的位置。在大多數情況下,它位於/bin/echo中,因此您可以使用/bin/echo -e "\n"來回顯新行。

2

嘗試

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

嘗試發出此多次。我希望你正在尋找相同的輸出。

相關問題