Bash脚本中的换行混乱问题

4
我有一个bash脚本,我在Windows上使用UltraEdit进行编辑,并另存为UTF-8无BOM格式,使用Unix行终止符样式,如UE的“另存为”对话框中所指定。
然后,我将其上传到运行Parallels Virtuozzo的CentOS 5 x86机器上,每次上传(无论是作为二进制文件通过FTP还是通过Parallels管理控制台)都无法工作。当我通过Parallels管理控制台查看脚本时,我发现最后一行,也仅仅是最后一行,有一个奇怪的字符。如果我从最后一行中删除行终止符(让脚本以最后一个可打印字符结束),一切都能正常工作。
我的问题:
A) 为什么只有最后一个行终止符会引起问题?
B) 如何避免这种情况发生?
谢谢!
7个回答

2
这里有两个问题:首先,假设编辑器使用Unix行尾符保存文件,你应该使用二进制FTP,而不是ASCII。其次,这很令人困惑,编辑器似乎在文件末尾插入了一个CTRL-Z(据我所知,自80年代末以来就不再需要了)。
请将由单行组成的文件保存并通过常规方式传输到Unix系统中,然后使用以下命令:
xxd myscript.sh

我想确认一下我的理论是否正确,需要查看文件中最后一个字节是否为0x1a


一行脚本转换为二进制后报告: 0000000: 2321 2f62 696e 2f62 6173 68 #!/bin/bash - Gaia
0000000: 2321 2f62 696e 2f62 6173 680d 0a #!/bin/bash.. - Gaia
尝试执行这两行代码时会显示额外的CR,这是我的问题。-bash:./hello.sh:/bin/bash ^ M:错误的解释器:没有那个文件或目录(抱歉,我无法在国际键盘上正确输入反引号)。 - Gaia

2
首先,我建议你以二进制方式传输,因为你似乎已经知道你想要的格式。
ASCII/文本FTP在你不想要时会进行行结尾转换。

如果那是问题,当我通过PMC转移时就不会发生了。除非PMC使用了一些基于FTP的传输方式,而我不知道... - Gaia
转换为二进制并不能修复,与预期一样,请查看对Sinan答案的评论。 - Gaia

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

我运行了Perl脚本,因为我的发行版上似乎没有dos2unix? - Gaia
首先,通常可以使用“file文件名”来确定文件是否具有DOS风格的CRLF行终止符。然后,如果你没有dos2unix,你可以在线获取适用于你平台的许多形式。 - nik

2
我在Ultraedit上使用了CTRL-H,它显示的与UNIX的XXD命令相同,并且我在其中看到0D 0A,尽管文件设置为使用UNIX行终止符。这是Ultraedit的问题。我正在使用v 13.20a。
我是stackoverflow的新手。我应该开一个新问题还是重新标记这个问题?
谢谢大家。

1
请将以下与编程有关的内容从英语翻译成中文。仅返回翻译后的文本:无需创建新问题...请使用您的更新修改此问题。 - Wadih M.

2

我曾经遇到过类似的问题,即在Ultraedit中保存所有新文件时都设置了BOM(字节顺序标记),尽管我已经取消了此选项。这在Linux中造成了混乱。解决方法是将默认编码设置为ANSII。至少在UltraEdit v18中可以进行此设置。

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

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


1
下一步是对文件进行十六进制转储并查看其中的内容。这听起来非常像其中有一个裸露的CR。请记住,回车符意味着“将下一个字符写入当前行的位置0”。尝试运行“hexdump -C file”甚至“od -t x1 file”,并查找0A和0D(0D=CR,0A=LF)。

这里有一个裸的CR (^M),问题是它是怎么出现的?我正在删除最后一行的所有尾随内容,然后插入一个新的换行符并按照上述规范保存文件。 - Gaia
od -t x1 file 返回 0000000 23 21 2f 62 69 6e 2f 62 61 73 68 0d 0a 0000015。 - Gaia

0

你可以远程编辑脚本。

emacs/vim/nano等在putty上运行良好。如果你喜欢emacs,你也可以使用tramp在任何一台机器上运行的emacs编辑远程文件,尽管我没有在windows上使用过tramp。komodo-edit也支持远程编辑,虽然我强烈推荐komodo-edit,但我没有使用过远程功能。


当然可以,但是我正在尝试找出我的当前方法有什么问题。它 应该 可以工作。谢谢。 - Gaia

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