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

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

# unix format
 etc/hadoop/container-executor.cfg: ASCII text

# dos format
 etc/hadoop/container-executor.cfg: ASCII text, with CRLF line terminators  
### 解析 Shell 脚本中的命令未找到错误 当遇到 `command not found` 类型的错误时,通常意味着系统无法识别所输入的指令。这可能是由于多种因素引起的。 #### 1. 环境变量配置不当 如果某些命令在特定环境中可用但在其他地方失效,则很可能是 PATH 变量设置不正确所致[^2]。PATH 是一个环境变量,用于指定可执行文件的位置列表。每当用户尝试运行某个程序而没有提供完整的路径名时,操作系统就会按照这个顺序查找相应的二进制文件。 为了验证这一点,可以打印当前用户的 PATH 设置: ```bash echo $PATH ``` #### 2. 命令解释器差异 不同类型的 shell 使用不同的语法解析方式来处理脚本。例如,在 Zsh 中可能会出现 Conda 初始化失败的情况,这是因为默认情况下 Miniconda 安装包只为 Bash 和 Fish 提供了初始化支持[^3]。对于这种情况,建议手动激活所需的 Python 环境或调整 `.zshrc` 文件以兼容 Conda 的加载逻辑。 #### 3. 行结束符问题 另一个常见原因是 Windows 和 Unix/Linux 平台之间的行分隔符区别。前者采用 CRLF (`\r\n`) 结尾,后者则只用 LF (`\n`)。这种差异可能导致 Linux 上读取由 Windows 编辑过的文本文件出现问题,特别是当这些文件作为批处理脚本来执行的时候[^4]。可以通过 dos2unix 工具轻松转换此类文件格式: ```bash dos2unix your_script.sh ``` #### 4. 参数缺失引发的伪 "Command Not Found" 有时表面上看似是找不到命令实际上是因为缺少必要的参数造成的误导性提示。比如给定的例子中提到训练模型所需的关键选项被遗漏了,从而触发了一个类似的警告信息[^1]。针对这类情况应当仔细检查官方文档并确保所有必需项都已正确定义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值