由于Windows和Linux行尾标识引起脚本无法运行的解决

 在所有的操作系统中,文本文件的结束或者换行都是有行尾符来标识的,C语言中经常使用\n作为换行,\r作为跳格TAB;实际上在计算机还没有真正出现之前,有种电传打字机的设备,每秒钟可以打印10个字符,但是这个家伙有一个问题,就是打完一行再换行的时候,要用去0.2秒的时间,如果在这0.2s的时间内有新的字符数据传递过来,那么该字符将会丢失;于是开发人员想到了一个办法,就是在每行结束的时候,加2个表示结束的字符,一个叫做"回车",字面意思是告诉打印机把打印头定位在左边界;另一个叫做"换行",告诉打字机把纸向下移一行,这样这两个字符正好填充这些中间操作的时间,保证了数据的完整性,以上就是"回车","换行"概念的大致由来。后来计算机发明了,也沿用了这个概念,当时存储器存储空间很小,价格也很昂贵,所以一些科学家认为给换行加一个字符就够了,两个字符太浪费,逐渐就出现了一些分歧,最终形成的结果就是:Unix系统每行结尾是"\n",Windows系统每行结尾是"\r\n",Mac系统每行结尾是"\r"。所以导致的问题是:Unix/Mac下的源文件在Windows下打开,会变成一行;Windows下的源文件在Unix/Mac下每行会被识别多出来一个"^M"这样的特殊字符。所以Windows下的源文件要比Linux/Mac下的文件大上一些,由于这种原因,导致Windows和Linux系统间移植源代码时,开始没有注意,到后来引起让人崩溃的问题,下面简单举个例子

  在Windows下一个简单的python源文件,并且运行无误:

  

  上传到Linux下之后,chmod赋予权限,./test.py会看到如下错误提示:

  

  很明显的看到,是没有python^M这个文件,因为头部是声明的执行环境,包括shell脚本也是一样,

  但是我们用python test.py这样解释器的方式执行是一切正常的

  

  这说明一个问题是,所有程序的源代码无论是Windows的"\r\n"换行,还是Linux的"\n"换行,程序的代码解释都不会有任何问题,因为每行代码后允许空格,tab,注释等多种字符,所以多个^M都是不影响的,出现这种问题,一般就是上面的脚本代码第一行声明的时候需要严格遵守即可

  其实IDE开发环境或者代码编辑器中都可以设置编程风格,在Linux下有最一般的修改方法,下面在Linux下修改:

  方法一,执行如下命令:

sed -i 's/^M//g' test.py 

  注意^M这个输入方法不是输入^再输入M,而是按住Ctrl+V快捷键,然后松开V,Ctrl不松,按M,按完之后^M就一并打好了,只有这个方法输入才是可以的,其他字符输入都一样

  

  现在运行就一切正常了,并且文件比原来小了一个字节,因为只有第一行代码进行了换行,所以就是\r这一个字节

  方法二使用vim打开文件,底行模式下运行命令  :set ff或者:set fileformat可以看到当前文件的换行标识,linux换行返回是fileformat=unix,Windows换行返回是fileformat=dos

   

  所以同样通过以下命令进行修改成Unix风格的换行:

  :set ff=unix或者:set fileformat=unix回车之后,然后:wq保存即可,效果和上面相同,如果转换成windows风格将后面值改为dos即可

  以上就是最基本的使用命令或者vi/vim进行行尾标识转换的方法

http://bbs.chinaunix.net/thread-1495312-1-1.html



猜你喜欢

转载自blog.csdn.net/xiaoyi23000/article/details/80022316