Bash脚本中的换行符疯狂

时间:2009-07-24 17:11:01

标签: newline ultraedit

我有一个bash脚本,我使用UltraEdit在Windows上编辑,并使用Unix Line Terminator样式保存为UTF-8 No BOM,如UE中“另存为”对话框中所指定。

然后我将它上传到运行parallels virtuozzo的centos 5 x86机器,每次,无论我如何上传它(FTP作为二进制文件,或通过parallels管理控制台),脚本都无法正常工作。当我通过parallels管理控制台查看脚本时,我发现最后一行,只有最后一行,其中有一个奇怪的字符。如果我从最后一行删除行终止符(让脚本以最后一个可打印字符结束)一切正常。

我的问题:

A)为什么只有LAST行终止符导致问题?

B)我将来如何避免这种情况?

谢谢!

7 个答案:

答案 0 :(得分:2)

首先我会建议你转移为二进制..因为你似乎确切地知道你想要的格式..

ASCII /文本FTP在您不想要的时候也可以进行行结束转换。

答案 1 :(得分:2)

你可以运行dos2unix来摆脱它们。

答案 2 :(得分:2)

这里有两个问题:首先,假设编辑器使用Unix行结尾保存,您应该使用二进制FTP,而不是ASCII。第二,这很令人费解,编辑器似乎在文件末尾插入一个CTRL-Z(自八十年代末AFAIK以来就没有必要)。

保存由单行组成的文件,通过常规方法将其传输到Unix系统并使用:

xxd myscript.sh

查看文件中的最后一个字节是0x1a来验证我的理论是否正确。

答案 3 :(得分:2)

我在Ultraedit上使用了CTRL-H,它显示与unix的XXD命令相同的输出,我在那里看到0D 0A,尽管该文件设置为使用UNIX行终止符。这是一个Ultraedit问题。我正在使用v 13.20a。

我是stackoverflow的新手。我应该打开一个新问题还是重新标记这个问题?

感谢所有

答案 4 :(得分:2)

我在所有保存的新文件中在Ultraedit中设置了BOM(字节顺序标记)的类似问题,即使我没有选中此选项。这在Linux中造成了严重破坏。解决方案是将默认编码设置为ANSII。此设置至少在UltraEdit v18中。

高级>配置>编辑>新文件创建

编码类型:创建新文件为ANSII

答案 5 :(得分:1)

下一步是对文件执行hexdump并查看其中的内容。这听起来非常像那里有一个裸CR。请记住,回车意味着“在当前行的位置0中写下一个字符”。尝试运行hexdump -C file甚至od -t x1 file并查找0A0D0D = CR,0A = LF)。

答案 6 :(得分:0)

您可以远程编辑脚本。

emacs / vim / nano等适用于腻子。如果你喜欢emacs,你也可以使用tramp编辑远程文件,其中emacs运行在你碰巧坐在前面的任何机器上,虽然我没有使用tramp与windows。 komodo-edit也是远程编辑,虽然我强烈推荐komodo-edit,但我还没有使用远程功能。