由于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上新建的文件,则没有这 ...
随机推荐
- GCD 常用代码
GCD 常用代码 体验代码 异步执行任务 - (void)gcdDemo1 { // 1. 全局队列 dispatch_queue_t q = dispatch_get_global_queue(0, ...
- 获取C#代码执行的时间(精确到毫秒)
using System.Diagnostics;//引用相关的命名空间Stopwatch st=new Stopwatch ();//实例化类st. Start();//开始计时 //需要统计时间的 ...
- Emoji表情符号录入MySQL数据库报错的解决方案(MySQL utf8与utf8mb4区别)
本文转自:http://blog.itpub.net/26230597/viewspace-1243233/前言:手机app应用评论的时候,恢复表情符号,提示失败. 1,查看tomcat后台日志,核心 ...
- oracle 中的trunc()函数及加一个月,一天,一小时,一分钟,一秒钟方法
返回处理后的数据,不同于round()(对数值进行四舍五入处理),该函数不对指定小数前或后的数值部分进行舍入处理. 语法:trunc(number[,decimals]) 其中,number为待做处理 ...
- assign与weak区别(面试)
weak 比 assign 多了一个功能就是当属性所指向的对象消失的时候(也就是内存引用计数为0)会自动赋值为 nil ,这样再向 weak 修饰的属性发送消息就不会导致野指针操作crash. 可能不 ...
- POJ 3292 Semi-prime H-numbers
类似素数筛... Semi-prime H-numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6873 Accept ...
- Python的Set和List的性能比较 + 两者之间的转换
1.能用set 不用list ~$ python -m timeit -n 1000 "[x for x in range(1000) if x in range(500, 1500)]&q ...
- 在使用开源library的PullToRefreshView中
下拉刷新几乎是每个应用都会有的功能,且大部分用的都是开源项目,下载地址:下拉刷新.如何在页面刚打开的时候自动触发下拉刷新的呢? 只需要一句代码,在PullToRefreshAdapterView Ba ...
- Java之异常处理机制
来源:深入理解java异常处理机制 2.Java异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 ...
- iOS开发——UI基础-KVC
除了一般的赋值和取值的方法,我们还可以用Key-Value-Coding(KVC)键值编码来访问你要存取的类的属性. 如何使用KVC存取对象属性呢?看个示例 一.使用KVC存数据 定义一个person ...