文件类型CRLF line terminators导致sh文件不能执行

两个相同内容的sh 文件一个可以执行 一个不可以



以上查看file类型  发现有区别 可以执行的那个sh 是我直接拷贝了tomcat的执行文件过来 把相同内容粘贴进去的 可以执行


根据网上一篇文章 描述

查看 cat -v  看文件具体内容




换行符不同 导致出错





具体文字内容转载如下


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

2015-12-22 00:19 by 潇湘隐者, 471 阅读, 0 评论, 收藏编辑

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]# 

clip_image001

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

clip_image002

我们可以用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格式。

clip_image003


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java和Git在处理换行格式时使用的是不同的标准,Java使用的是LF(Line Feed)换行符,而Git默认使用的是CRLF(Carriage Return + Line Feed)换行符。因此,在使用Git进行版本控制时,如果文件中存在CRLF格式的换行符,会导致文件的整个内容被认为发生了改变,即使只是修改了一行代码的内容,也会被视为整个文件发生了修改。 这种问题的解决方法有两种,一种是让Git忽略CRLF格式的换行符,可以通过在.gitattributes文件中添加如下代码实现: * text=auto eol=lf 这样Git就会把CRLF转换成LF,并且忽略CRLF的差异,只关注代码的内容是否发生了改变。 另一种方法是让Java使用CRLF格式的换行符,可以在Eclipse中进行设置,在Window -> Preferences -> General -> Workspace -> New text file line delimiter中选择“Other”并选择“Windows”即可。 总之,要避免这种问题的发生,建议在使用Git进行版本控制时,尽量使用LF格式的换行符,并设置好相关的控制参数。同时,在编写Java代码时,也要注意使用LF格式的换行符,以避免以上问题的发生。 ### 回答2: Java是一种广泛使用的编程语言,而Git是一种流行的版本控制系统。我们可以使用Git在不同的计算机上管理Java代码,并在不同的时间点恢复或访问历史版本。 在使用Git管理Java文件时,我们需要注意换行符的格式问题。 Java在Windows操作系统上使用的换行符是CRLF(回车+换行),而在Linux和Mac操作系统上使用的是LF(仅换行)。 如果我们在Windows操作系统上生成Java代码并将其提交到Git仓库中,Git会默认使用CRLF作为换行符格式。然而,如果我们在Linux或Mac上的计算机上从Git仓库中检出该代码,则会将CRLF转换为LF。这样会导致文件内容的改变,虽然我们实际上没有更改代码。这可能导致编译错误或导致代码无法正常运行。 为了解决这个问题,我们可以在 Git 中设置 core.autocrlf 的参数。如果设置为 true,则 Git 会在检出代码时自动转换 CRLF 格式为 LF 格式,并在提交代码时将 LF 转换为 CRLF。如果设置为'input',则 Git 仅会在检出代码时将 CRLF 转换为 LF。 另外,我们还可以使用.gitattributes文件指定Java文件应使用的换行符格式。通过在根目录下的.gitattributes文件中添加以下行:*.java text eol=lf,我们可以告诉Git仓库Java文件应使用 LF 格式作为换行符。这样就可以避免由于Git自动转换换行符格式而导致Java文件内容变化的问题。 总之,确保在跨不同操作系统使用Git时,要注意并正确处理文件的换行符格式,避免不必要的问题。 ### 回答3: 在使用Git进行代码版本控制或者进行代码合并的过程中,常常会出现整个文件被修改的情况,而造成此问题的原因很多,其中一个就是换行格式的问题。 在程序中,每行的结尾都有一个不可见的换行符,而不同的操作系统对于换行的处理方式是不同的:Windows中的换行标识为CRLF(回车+换行),而Unix/Linux中的换行标识为LF(换行)。而在Java中,使用不同的换行格式是没有问题的,因为Java自动处理了换行符的问题。 然而,在使用Git时,如果Java中的换行格式是CRLF,而Git中的换行格式是LF,那么就会出现整个文件被修改的情况。具体来说,Git在进行代码合并时会自动检测换行符格式,并将所有的换行符替换为LF,而这个过程会被Java误认为是文件全部被修改了,导致所有的行末的CRLF被替换成了LF,从而导致了整个文件被修改的情况。 为了避免这种情况的出现,开发者可以通过配置Git,让Git使用与Java相同的CRLF格式,这样就能避免因换行格式不同而导致文件被修改问题。 总之,换行符格式问题虽然看似微小,但在代码版本控制和合并中却经常会引起问题,因此在开发过程中需要格外注意。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值