自动修复shell脚本或与^ M中断的文件的行结尾的方法

问题

我们经常打破我们的文件结尾,事情停止工作,没有我们注意到。

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)。 有时我们复制/粘贴,我认为这是造成这个问题的原因。 是的,有时我们不会为了不太好的原因而testing我们的更改:相同的脚本在复制服务器上工作,更改只是缩进一些行等。 我同意这应该解决。

没有计划使用Chef / Puppet-like解决scheme。

更新

TLDR复制粘贴不是问题,FTP是。

我在Windows + Notepad ++ + PuTTY + nano和vi上做了一些复制/粘贴Windows行尾的CRLFtesting。 它看起来像CR(^ M)字符被过滤,只有LF被粘贴到文件。 感谢ewwhite让我怀疑复制/粘贴理论!

我使用FileZilla通过FTP传输了一个CRLF结尾的文件,选项“发送模式”为自动。 CRLF被保留。 我不知道FileZilla是否可以将它们转换为LF。

减轻

我们不能禁止非Linux操作系统,也不能禁止复制粘贴。

我想到了这些解决scheme:

  1. 构build一个运行dos2unix或sed所有脚本的cron.minutely。 缺点:我们需要维护一个“可修改的文本文件”列表,因为我不希望它在/
  2. 使用文本编辑器,可以在文件更改后支持其他命令。 缺点:可能会破坏合法使用非Linux行结尾的文件,在我们ftp脚本时不起作用。
  3. 使用像http://inotify.aiken.cz/?section=incron&page=about&lang=en这样的触发系统。 缺点:?

#2和#3的优点:我们也可以使用这些为需要它的程序添加最后的空白行。

使用bash,版本4.2.37(1) – 释放

相关的问题^ 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

编辑:我有一个downvote,你能解释为什么吗?

我必须偶尔处理一些遗留系统。 有时保留在组织的源代码控制( Borland Starteam )中的文件被设置为错误的换行configuration。

但是在许多跨平台环境中工作,复制/粘贴不应该单独引起这个问题。 尝试根据以下的输出来识别趋势,并适当地处理最坏的犯罪者。

使用DOS换行定期search文件。

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将修改权限…