遇到一例因shell文件的编码问题导致执行后不能得到正确结果的问题。一般来说脚本中不会带有中文,不过有时候例外,例如你要查找一个文本中的字符串,cat test.txt | grep "汽车" 这样的命令,如果文件编码不对,就可能得不到正确结果。
我的问题是:有一个脚本,无论怎么执行结果都不对,但是我把它里面的关键的几句话单独拿出来,在SecureCRT终端下依次执行,最后得到的结果却正确,奇了。于是我终于想起来可能有中文的影响,在终端里查看shell脚本的内容,发现不能正确显示出一处中文(乱码了),可见正是这处乱码,导致了grep输出的结果不正确。但是在SecureCRT终端下,无论是用vi还是emacs,我都无法向文件中输入中文(上屏的中文全都乱码),于是怀疑是文件编码问题。
然后我就将脚本下载到Windows下,用UltraEdit将其另存为UTF-8格式,再上传到Linux中,再执行脚本,竟然报错:cannot execute binary file
这种问题的原因之一是脚本中有不可识别字符。于是我再用UltraEdit,将文件重新存为“UTF-8 无 BOM”格式(如下图),再上传到Linux中,就可以正确执行了。
网上还有很多文章,介绍了如何用emacs,vi 或 vim更改文件编码的方法,应该也是可以的,但用UltraEdit最方便。
另外再记一个小技巧:用 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。
文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤
转载需注明出处:codelast.com
感谢关注我的微信公众号(微信扫一扫):