将换行符附加到shell脚本中的输出文件

时间:2012-03-16 16:59:32

标签: bash shell cygwin append

我有一个我在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语句,而不附加到文件,它会给我带有尾随换行符的预期输出。

5 个答案:

答案 0 :(得分:28)

我认为问题在于Cygwin正在将Unix行结尾(LF)写入文件,而您正在使用期望Windows行结束(CRLF)的程序打开它。要确定是否是这种情况 - 并且对于一些hackish变通方法 - 请尝试:

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

(最后$'\r'是一个额外的回车符;它加上Unix行结束,将导致Windows行结束。)

答案 1 :(得分:20)

尝试:

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

或只是:

echo $'\n' >> output.log

答案 2 :(得分:3)

您可以在没有I / O重定向的情况下执行此操作:

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

您还可以使用此命令将换行符附加到文件列表:

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

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

答案 3 :(得分:3)

尝试

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

尝试多次发出此信息。我希望你正在寻找相同的输出。

答案 4 :(得分:0)

这也可行,并且比echo版本更具可读性:

printf "`date` User `whoami` started the script.\r\n" >> output.log