由于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
由于Windows和Linux行尾标识引起脚本无法运行的解决的更多相关文章
- Perl Tk在IC设计中的应用、Windows、Linux平台下的安装-各种错误的摸索解决
本文转自:自己的微信公众号<集成电路设计及EDA教程> <Perl Tk在IC设计中的应用.Windows.Linux平台下的安装-各种错误的摸索解决> Perl在IC设计中有 ...
- 【转】Windows与Linux(Ubuntu)双系统时间不一致的解决方法
当在嵌入式Linux里面备份文件时候,在备份的时候,PC(win7)和开发板的时间都是9:30,但是在开发板发现文件创建时间是9:30,然后u盘插在PC(win7)上,发现文件创建时间是1:30,为什 ...
- linux 使用 lockf命令防止脚本重复运行
之前服务器的脚本,迁移至一台新的机器上,运行脚本,提示报错信息: -bash: /usr/bin/lockf: 没有那个文件或目录 或 -bash: /usr/bin/lockf: no such ...
- Unity3D脚本行尾(Line Endings)
行尾不一致(inconsistent line endings ) 开发环境 有时候编辑Unity的脚本文件,代码diff之后,或者从svn更新文件之后,Unity中会出现行尾不一致的信息. 我的开发 ...
- windows和linux文本的编码格式不一样所出的错
windows下编写的python脚本上传的linux下执行会出现错误: usr/bin/python^M: bad interpreter: No such file or directory 原因 ...
- python中,如何将多行进行输出,同时将行尾的换行符去掉
需求说明: 比如我要输出字符串的常量,字符串常量要输出多行,该怎么解决呢 操作过程: 1.可以通过三引号(""" .... """)将要输出 ...
- linux shell 用sed命令在文本的行尾或行首添加字符
转自 http://www.cnblogs.com/aaronwxb/archive/2011/08/19/2145364.html 昨天写一个脚本花了一天的2/3的时间,而且大部分时间都耗在了sed ...
- 转:在linux中vi 文件里行尾奇怪的^M及解决
Linux编辑器vim中删除行尾的^M 有时候,在 Linux 中使用打开曾在 Windows 中编辑过的文件时,会在行尾看到 ^M 字符.看起来总是感觉很别扭. 删除方法如下: 在 Vim 的命令模 ...
- linux向文件中添加数据,数据被追加到了上一行的行尾
当我们在windows上新建了文件,并且要上传到linux上时,一定要在文件后加上空格,否则就会出现标题上讲的,数据被追加到了上一行的行尾,而不是新起一行,但是如果是在linux上新建的文件,则没有这 ...
随机推荐
- 【转】Kafka producer原理 (Scala版同步producer)
转载自:http://www.cnblogs.com/huxi2b/p/4583249.html 供参考 本文分析的Kafka代码为kafka-0.8.2.1.另外,由于Kafka目前提供了两 ...
- linux网络:常用命令(一)
1.ifconfig 可以查看Linux的网卡情况 ifconfig eth0 查看 eth0的信息 给一块网卡设置多个ip地址: ifconfig eth0:0 192.168.1.12 255. ...
- 原生JavaScript技巧大收集(11~20)-(终于又被我找到这篇文章了)
11.原生JavaScript加入收藏夹 function AddFavorite(sURL, sTitle) { try { window.external.addFavorite(sURL, sT ...
- Ubuntu 16.10 虚拟机安装记录
一定要选自定义. 这里一定要选 稍后安装操作系统 都是坑! 启动时出现'SMBus Host Controller not enabled'错误提示,进不到图形界面. 解决办法:1.在启动Ubunt ...
- Express开发实例(2) —— Jade模板引擎
前一篇通过helloworld,简单介绍了Express中的开发,本篇继续深入的学习express的模板. 关于Jade的用法,网上有很多,本篇参考:Jade语法 安装相关模块 在实验代码前,应该先安 ...
- 将本地的新建的web Form页面放到服务器提示错误;
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test.aspx.cs&q ...
- session 的用法
</head> <body> <?php //session_start();//开启session,必须写在PHP代码最顶端 //HTTP,无状态性 //记录登陆者状态 ...
- 【bzoj4034】[HAOI2015]树上操作
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都 ...
- 网络编程1-TCP编程(socket)
1 如何实现网络中的主机相互通信 一定的规则,有两套参考模型 (1)osi参考模型,过于理想化,未能在互联网上推行 osi有七层 (2)tcp/ip参考模型,有四层,各层之间通过不同的网络协议传输数据 ...
- ubuntu下修改apache2.4的rewrite
sudo a2enmod rewrite 修改/etc/apache2/apache2.conf中 AllowOverride None 为 AllowOverride ALL 重启 service ...