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