在shell脚本中向输出文件添加换行符

37
我有一个在Cygwin中执行的shell脚本(也许这就是问题所在)。对于这段代码,我只想写第一行,并添加一个换行符:

我有一个正在Cygwin中运行的shell脚本(也许这就是问题所在)。对于这段代码,我只想写下第一行,并在后面加上一个换行符:

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

但是 output.log 文件似乎永远不会停止增长。如果我多次运行脚本,好像第二条 echo 命令不会写入文件。

我还尝试了:

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

它产生相同的结果。

奇怪的是,如果我只在命令行上输入上面的第二个echo语句,而不是将其附加到文件中,它会给出预期输出并带有换行符。


奇怪。你是如何确定没有添加换行符的? - Michał Kosmulski
实际上,我刚刚看了一下,似乎我正在打开登录日志的程序没有正确解释LF,并且期望Windows换行符。如果我使用cat命令输出,它似乎会遵守这些换行符。 - Ode
5个回答

37

我猜问题在于Cygwin将Unix换行符(LF)写入文件,而您打开该文件的程序期望Windows换行符(CRLF)。为了确定是否是这种情况—并进行一些hackish workaround—请尝试:

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

(在这里,$'\r'代表一个额外的回车符;它和Unix换行符一起会导致生成Windows的换行符)


这个完美地运行了。关于Unix和Windows换行符的假设似乎是问题所在。 - Ode

24

尝试:

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

或者只需要:

echo $'\n' >> output.log

请注意,在$'...'中不执行命令替换,因此该版本将打印实际字符串,包括反引号、"date"和"whoami"等所有内容,而不是运行datewhoami命令。 - ruakh
@ruakh - 很好的发现。我没有注意到。我更新了我的答案。 - Daniel Haley
1
"$'\n'无法工作,需要使用ruakh的解决方案中的"$'\r'。非常感谢! - Ode

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

请尝试多次发出此命令,我希望您期望获得相同的输出。


5
这个也可以运行,而且可能比echo版本更易读:
printf "`date` User `whoami` started the script.\r\n" >> output.log

3

您可以在不进行I/O重定向的情况下完成此操作:

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

您也可以使用此命令将换行符添加到文件列表中:
find dir -name filepattern | xargs sed -i 's/$/\n/' filename

echo命令在某些shell中作为内置命令实现,可能不接受-e选项。如果您仍想使用echo,请尝试找到echo二进制文件所在的位置,可以使用which echo命令。在大多数情况下,它位于/bin/echo,因此您可以使用/bin/echo -e "\n"来输出新行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接