CRLF line terminators导致shell脚本报错:command not found

Linux和Windows文本文件的行结束标志不同。在Linux中,文本文
件用"/n"表示回车换行,而Windows用"/r/n"表示回车换行。有时候在Windows编写shell脚本时需要注意这个,否则shell脚本
会报"No such file or directory"或"command not found line
x"之类的错误,如果不知晓前因后果,肯定会被这个折腾得相当郁闷。如下所示test.sh

[root@DB-Server myscript]# more test.sh 
. /home/oracle/.bash_profile
echo ' '
date
echo ' '
 
sqlplus test/test @/home/oracle/scripts/test.sql
 
echo ' '
date
echo ' '

执行test.sh脚本过程中报" No such file or
directory /home/oracle/.bash_profile" 和"command not found line xx".
如果你从shell脚本语法方面去检查,根本没有任何问题。不知具体原因的肯定相当郁闷。

[oracle@DB-Server myscript]$ ./test.sh
 
: No such file or directory /home/oracle/.bash_profile
 
: command not found line 2: 
 
: command not found line 4: date
 
: command not found line 6: 
 
: command not found line 7: 

如果你用file命令查看test.sh,你会发现文件编码为
ASCII,with CRLF line terminators。我们用cat -v test.sh 可以看到^M
(\r的十六进制为0D,对应的控制符为^M)。 cat -v可以看到文件中的非打印字符。

[root@DB-Server myscript]# 
[root@DB-Server myscript]# file test.sh 
test.sh: ASCII text, with CRLF line terminators
[root@DB-Server myscript]# cat -v test.sh 
. /home/oracle/.bash_profile^M
echo ' '^M
date^M
echo ' '^M
^M
sqlplus test/test @/home/oracle/scripts/test.sql^M
^M
echo ' '^M
date^M
echo ' '^M
[root@DB-Server myscript]# 

vi命令查看test.sh文件看不到^M, 其实这个跟vi的版本有关系。有些版本vi显示的是行尾为^M(AIX下都是显示^M)。而有些vi打开时可以看到底下有[dos]的格式提示。

我们可以用file命令对比正常的shell脚本的格式和编码。如下所示

[oracle@DB-Server myscript]$ file myshell.sh
 
myshell.sh: Bourne-Again shell script text executable

解决这个问题其实也不难,有很多方式,例如直接使用vi编辑器编写shell脚本;使用cat命令创建shell脚本,然后从Windows文本工具里面拷贝脚本过来;最方便的还是使用dos2unix将DOS格式文本文件转换成Unix格式或Linux格式。

时间: 2024-12-31 09:19:15

CRLF line terminators导致shell脚本报错:command not found的相关文章

shell脚本报错:no input files

问题描述 shell脚本报错:no input files 本人小白,写了个简单的shell脚本: #!/bin/sh #this is a script that can replace character "|" to " " #name: cc #to call:cc < filename tr '|' ' ' | cat -n 但是一执行就报错 cc:no input files 求解惑 解决方案 shell脚本报错:-bash: xxx: /bin/

linux脚本报错-red hat5搭建apache环境完成后无法启动httpd,脚本报错

问题描述 red hat5搭建apache环境完成后无法启动httpd,脚本报错 最近学习在red hat5上web程序设计,在搭建LAMP源码环境搭建WEB服务Linux+Apache+MySQL+PHP的时候,按照http://www.linuxidc.com/Linux/2013-05/84882.htm的步骤进行. 但是到了安装apache时,已经将httpd安装完成,而且按照该网页的步骤写一个httpd启动脚本,但是始终没法启动hpptd.该脚本如下: #!/bin/sh #set -

R12.1.3 应用克隆过程中autocfg脚本报错

报错信息如下: AutoConfig Services PhaseRunning Service Process 4 of 8 for AD_TOPExecuting script in InstantiateFile:/u01/TEST01/apps/tech_st/10.1.3/perl/bin/perl -I /u01/TEST01/apps/tech_st/10.1.3/perl/lib/5.8.3 -I /u01/TEST01/apps/tech_st/10.1.3/perl/lib/

js 脚本-编写HTML时,IE浏览器脚本报错

问题描述 编写HTML时,IE浏览器脚本报错 <script type="text/javascript" src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.min.js"></script> <script type=text/javascript> $(document).ready(function() { jQuery.jqsxfg51nav = functio

sqlyog导入数据库脚本报错

前两天将客户的数据库备份成sql文件,sql文件大小61M.发给同事之后.同事说导入的时候一直报错.导出方式和发送了几次,还是报错.我还以为我的导出有错或者网络原因.可是在我的电脑上测试还是出现这样的问题. 最后的解决办法是: #直接在sqlyog里面执行,修改这两个变量的值: set global max_allowed_packet=10000000; set global net_buffer_length=10000; 执行完这两句后,再次导入sql文件问题得到解决.下面是执行完这两句之

extjs 嵌入到jsp页面脚本报错

问题描述 我把Extjs2.0嵌入到JSP页面,当显示一个Window时报脚本错误.但是在普通的HTML页面能显示......跪求高手指导.(首先我是把extjs引入成功了)就是显示一些面板窗体时就报错了好象是他愿文件里面出错了.急急急???? 解决方案 解决方案二:你的jsp文件要发布到web服务器上才能执行.另外你的ext包也要一同发布到服务器上,注意你的路径要写发布后的路径.解决方案三:报的错误是什么描述??解决方案四:哎呀正在遭遇此类的问题,但是我必须成功!

sqlserver2000备份出来的库还原到2008r2版本报错?

问题描述 sqlserver2000备份出来的库还原到2008r2版本报错? 这是我自己检查备份库报的错我怀疑是备份库出错了!各位大神求教! 解决方案 如果该数据库2008有的话你先备份然后删除该数据库,再试试把2000的还原上去试试,不行的话试试手动的方式不要写SQL 解决方案二: EAS demo库还原 sql2008R2

CAS登陆验证后查询用户基本信息时中文出现乱码,导致deployerConfigContext.xml报错

问题描述 CAS登陆验证后查询用户基本信息时中文出现乱码,导致deployerConfigContext.xml报错是在验证用户名密码正确后查询用户基本信息时,用户真实姓名是中文查询出来是乱码报错:严重:org.xml.sax.SAXParseException:Theelementtype"cas:userRealName"mustbeterminatedbythematchingend-tag"</cas:userRealName>".org.xml

struts 2.3.24-struts2.3 + ajax 新版本报错

问题描述 struts2.3 + ajax 新版本报错 我用的是Struts2 版本 struts2-dojo-plugin-2.3.24.1.jar 代码如下: <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <%@