遇到一例因shell文件的编码问题导致执行后不能得到正确结果的问题。一般来说脚本中不会带有中文,不过有时候例外,例如你要查找一个文本中的字符串,cat test.txt | grep "汽车"  这样的命令,如果文件编码不对,就可能得不到正确结果。

我的问题是:有一个脚本,无论怎么执行结果都不对,但是我把它里面的关键的几句话单独拿出来,在SecureCRT终端下依次执行,最后得到的结果却正确,奇了。于是我终于想起来可能有中文的影响,在终端里查看shell脚本的内容,发现不能正确显示出一处中文(乱码了),可见正是这处乱码,导致了grep输出的结果不正确。但是在SecureCRT终端下,无论是用vi还是emacs,我都无法向文件中输入中文(上屏的中文全都乱码),于是怀疑是文件编码问题。

文章来源:http://www.codelast.com/

然后我就将脚本下载到Windows下,用UltraEdit将其另存为UTF-8格式,再上传到Linux中,再执行脚本,竟然报错:cannot execute binary file

这种问题的原因之一是脚本中有不可识别字符。于是我再用UltraEdit,将文件重新存为“UTF-8 无 BOM”格式(如下图),再上传到Linux中,就可以正确执行了。

另存为UTF-8 无BOM格式

网上还有很多文章,介绍了如何用emacs,vi 或 vim更改文件编码的方法,应该也是可以的,但用UltraEdit最方便。

文章来源:http://www.codelast.com/

另外再记一个小技巧:用 ps -ef | grep XXX 命令查看系统中是否存在某个进程的时候,输出结果中会包含有grep命令这一行,例如:

ps -ef | grep httpd

部分输出为:

root     27154 27129  0 20:35 pts/3    00:00:00 grep httpd
daemon   28834  2955  3 13:35 ?        00:16:23 /usr/local/apache2/bin/httpd -k start

可见第一行是干扰,我们不想看到它,那么可以有两种方法来过滤掉这一行:

ps -ef | grep httpd | grep -v grep

或:

ps -Ao pid,comm,args | grep httpd

这种方法输出的内容中只包含进程号、进程名、调用参数,具体使用可man ps。

 

shell脚本因文件编码问题不能正确执行的问题
Tagged on:                                                                         

发表评论

电子邮件地址不会被公开。 必填项已用*标注