ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

更改文件格式由 dos 到 unix

更改文件格式由 dos 到 unix

这个错误:

bash: ./install.sh: /bin/bash^M: 错误的解释器: 没有那个文件或目录

本质原因是:install.sh 文件使用了 Windows 的换行符(CRLF),而 Linux 需要 Unix 换行符(LF)


原因解释

Linux 执行脚本时,会读取第一行:

#!/bin/bash

作为解释器路径。

但是你的文件实际是:

#!/bin/bash\r

其中:

  • \r = Windows 回车符(CR,ASCII 13)
  • \n = Linux 换行符(LF,ASCII 10)

所以 Linux 看到的解释器变成:

/bin/bash^M

它会尝试寻找:

/bin/bash^M

当然不存在,于是报:

错误的解释器: 没有那个文件或目录

解决方法 1:dos2unix(推荐)

安装:

Debian/Ubuntu:

sudo apt install dos2unix

转换:

dos2unix install.sh

然后:

./install.sh

即可。


解决方法 2:使用 sed

不安装工具:

sed -i 's/\r$//' install.sh

检查:

./install.sh

解决方法 3:vim 修改

打开:

vim install.sh

查看文件格式:

:set ff?

如果显示:

fileformat=dos

说明是 Windows 格式。

修改:

:set ff=unix

保存:

:wq

解决方法 4:重新生成文件

如果这个脚本来自 Windows:

例如:

Windows → Git → Linux

建议 Git 配置:

Linux 下:

git config --global core.autocrlf false

或者:

git config --global core.autocrlf input

这样 checkout 到 Linux 时保持 LF。


如何确认是否有 CRLF?

执行:

file install.sh

如果看到:

install.sh: Bourne-Again shell script, ASCII text executable, with CRLF line terminators

说明就是这个问题。

也可以:

cat -A install.sh | head

看到:

#!/bin/bash^M$

其中:

^M

就是 Windows 回车符。


额外建议

以后在 Linux 下写 shell:

文件第一行:

#!/usr/bin/env bash

比:

#!/bin/bash

更通用,因为 bash 可能安装在:

/usr/local/bin/bash

或者其他路径。

例如:

#!/usr/bin/env bashecho "hello"

然后:

chmod +x install.sh
./install.sh

即可。

返回列表