dos和unix换行符的转换--俺又被这无形字符害了一把

来源:互联网 发布:淘宝法律法规限制下单 编辑:程序博客网 时间:2024/04/28 16:29

这几天在做系统自动发布的事情,其中用到了shell脚本。真是够郁闷的,本来跑得好好的脚本,在我加了一段配置后跑不起来了。

我先是写了一段脚本来读取配置文件。
配置文件和ant的properties文件格式一样,很简单形如:
user=abc
host=myhost

配置文件getconfig.sh,读取参数1的配置选项,是这么写的:
FILE_ENV_PROP="myproject.prop"
echo `grep ^$1= $FILE_ENV_PROP | awk -F = '{print $2}'`
就是读取文件中以配置项开头,等号以后的部分。

加了一段配置后死或跑不起来,原来一直有的。本来一直以为是getconfig.sh的原因,因为刚好我改过一点。后来怀疑是不是shell的解释器被人给改了,还是找不出原因。终于在另外一台机器上看到了原来的脚本,是可以跑通过的。ftp过来以后还是跑不起来,最后才发现,是配置文件不一样。原来我增加配置项时是在windows改的,每个行后面是多了一点东西的,但是在linux下看不出来,用vi和more都是看不到(这个和solaris不一样啊,solaris的vi是可以看到一个^M符号的)。所以我也一直没在意,被以前的solaris经验忽悠了。用ultraedit的16进制方式可以很明显地看出来:windows的换行是0D0A,unix的换行只有0A。

这样的事情以前也碰过,怎么还是会再犯呢?看来要避免还是挺难的。只有凭经验了,而且要养成如果是linux类型的系统,坚持只使用vi编辑文本。

----------------------以下20070307添加-------------------------------------------

那怎么把dos格式转成unix格式呢?我以前的经验是用ultraedit,在“文件-转换”菜单里有一个这样的工具。但是这次我没成功,一查网上提供了两个方法:
1)利用vi,在vi上打:set ff?,可以显示当前的类型。打:set ff=unix,就可以转换行符号为unix类型;打:set ff=dos那就是dos类型,ff也就是fileformat的意思,把ff写全名fileformat也是可以的。
2)利用sed,执行sed s/^M//g file1 > file2 ,也可以转。但是要注意^M是先按住ctrl-v在按m打出来的。不是字符串^M。

出现更有意思的情况。cvs这个王八羔子,我好不容易把dos转成unix格式,但是一提交到cvsserver,再从别的机器下载下来,换行符号又变回去了。而且,cvs是不区别这两种换行符的。大概是因为服务器使用cvsnt的关系,又或者是在取文件时转的。

最后我采取了一个蹩脚的做法,在每次取下文件后,用sed转换一次。

原创粉丝点击