====================================编码问题====================================
问题描述
我自己写了一个Python脚本,在Linux服务器和我的Mac上运行都报错:
./build_system.py: line 1: #!/usr/bin/python: No such file or directory
在网上搜索了半天,发现都说都问题原因是第一行尾部写入了Windows都回车“ ”,导致解析成了“python ”而不是“python”,因而报错是“: No such file or directory”( 符号导致了行开始,覆盖了原来都内容)。从网上都这个解释来看,跟我都这个问题现象不是一样的。更何况,我手动删除第一行,在Linux环境下重写了一遍,还是一样的报错,因此可以证明我遇到的问题并非是“ ”引起的。
问题分析
我认为一定是有不可见字符导致的问题。于是,我用Linux命令diff找一个可以运行的Python脚本来对比下头部:
$ diff ../../unibuild/unibuild.py build_system.py | more 1c1 < #!/usr/bin/python --- > <U+FEFF>#!/usr/bin/python
果然不出所料,不能运行的脚本文件开头,多了一个不可见内容<U+FEFE>,搜索这个字符发现了问题原因。
问题原因
引用网友的描述:
有些编辑器,比如M$ Windows的记事本,在创建UTF8编码文件时会在头部添加一个不可见字符。这个字符可以通过vim查看到,而且如果是一个php文件,php4、php5在解析时均会有输出。 原来这个被称作BOM(Byte Order Mark)的不可见字符,是Unicode用来标识内部编码的排列方式的,在UTF-16、UTF-32编码里它是必需的,而在UTF-8里是可选的。因此,才会出现有的编辑器在文件头部添加添加BOM、而有的语法解析器又不作处理的的混乱情况。 根据w3c里FAQ的建议,解决方法就是,删无赦。
问题解决
用vi编辑器打开出问题的文件,输入如下指令:
:set nobomb #删除UTF-8 BOM字符
反之,如果是保留UTF-8 BOM则输入“:set bomb”.
====================================回车问题====================================
问题描述
Windows平台下的文件夹共享给了Linux来访问执行,运行脚本的时候报错:
bash: ./main.py: /usr/bin/python^M: 解释器错误: 没有那个文件或目录
问题原因
Windows平台下的回车是 ,但是Linux平台是 ,多出来的 对解释器造成了干扰,需要去掉多余的 符号。
问题解决
用sed来处理文本替换问题真的是有奇效!输入如下命令:
sed -i 's/ $//' test.sh
附录帮助
[root@www ~]# sed [-nefr] [动作] 选项与参数: -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。 -e :直接在命令列模式上进行 sed 的动作编辑; -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作; -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法) -i :直接修改读取的文件内容,而不是输出到终端。 动作说明: [n1[,n2]]function n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』 function: a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚; i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~ s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦! -------------------------------------------------------------------- 一个例子: sed -i 's/原字符串/新字符串/' /home/1.txt