问题
我们经常会破坏文件的行尾,导致程序在我们不知情的情况下停止运行。
Bash 抱怨“无效选项”或“:未找到命令”,如下所述:http://thinkinginsoftware.blogspot.ca/2012/11/linux-server-cries-for-linux-desktop.html
我担心这也会破坏其他文本文件(conf、crons……)
我们如何打破它(我想)
我们是一群使用 Windows、Mac 或 Linux 在一台服务器上编辑 Linux 文件的人。我们手动编辑这些文件(ssh + vi/nano 或 localy + ftp)。
有时我们会复制/粘贴,我认为这就是导致问题的原因。
是的,有时我们不测试我们的更改,原因不太好:相同的脚本在复制服务器上运行,更改只是缩进一些行,等等。我同意应该解决这个问题。
不计划使用类似 Chef/Puppet 的解决方案。
更新
TLDR 复制粘贴不是问题,FTP 才是问题。
我对在 Windows + Notepad++ + PuTTY + nano 和 vi 上复制/粘贴 Windows 行尾 CRLF 进行了一些测试。看起来 CR (^M) 字符被过滤了,只有 LF 被粘贴到文件中。感谢 ewwhite 让我对复制/粘贴理论产生了怀疑!
我使用 FileZilla 通过 FTP 传输了一个以 CRLF 结尾的文件,将“发送模式”选项设置为自动。CRLF 被保留了下来。我想知道 FileZilla 是否可以将它们转换为 LF。
减轻
我们不能禁止非Linux操作系统,也不能禁止复制粘贴。
我想到过以下解决方案:
- 构建一个在所有脚本上运行 dos2unix 或 sed 的 cron.minutely。缺点:我们需要维护一个“可修改文本文件”列表,因为我不想让它在 / 上运行
- 使用可在文件更改后支持附加命令的文本编辑器。缺点:可能会破坏合法使用非 Linux 行尾的文件,在我们 ftp 脚本时不起作用。
- 使用触发系统http://inotify.aiken.cz/?section=incron&page=about&lang=en. 缺点:?
#2 和 #3 的优点:我们还可以使用它们为需要它的程序添加最后的空白行。
使用 bash,版本 4.2.37(1)-release
有关 ^M (CRLF) 的相关问题
- 哇,这不可能是错的。错在哪里?
- https://stackoverflow.com/questions/3852868/how-to-make-vim-show-m-and-substitute-it
- https://stackoverflow.com/questions/10559774/file-with-control-m-characters
编辑:我被投了一张反对票,你能解释一下原因吗?
答案1
我有时必须处理一些遗留系统的问题。有时,组织源代码管理中保留的文件(宝兰星队) 设置为错误的换行配置。
但在多个跨平台环境中工作时,复制/粘贴不应单独导致此问题。尝试根据以下输出确定趋势,并适当处理最严重的违规者。
定期搜索带有 DOS 换行符的文件。
find /var/www -not -type d -exec file "{}" ";" | grep CRLF
例子:
# find /ppro/bin -not -type d -exec file "{}" ";" | grep CRLF
/ppro/bin/compile/save/srcfix.c: ASCII C program text, with CRLF line terminators
/ppro/bin/compile/bldtag.c: ASCII Pascal program text, with CRLF line terminators
/ppro/bin/compile/bldtag.c.sav: ASCII Pascal program text, with CRLF line terminators
/ppro/bin/compile/dbcsum2.c: ASCII Pascal program text, with CRLF line terminators
/ppro/bin/hphw/print_sv.c: ASCII text, with CRLF line terminators
/ppro/bin/linuxhw/dhcpd.conf: ASCII text, with CRLF line terminators
/ppro/bin/linuxhw/dhcpd.conf.mult_subnet: ASCII text, with CRLF line terminators
然后烧伤他们!!
请记住,dos2unix
在某些系统上会修改权限...