Windows → Linux

bash 说 No such file,但文件明明存在

从 Windows 传到 Linux 的脚本常携带 CRLF 行尾。隐藏的回车字符会污染 shebang(脚本解释器声明)或参数,让错误看起来像“文件不存在”。

更新于 2026-07-11 · 约 5 分钟

先只读检查

下面的命令只查看文件类型和隐藏字符,不修改内容:

file deploy.sh
cat -v deploy.sh | head

若看到 CRLF^M/bin/bash^M,基本可以确认行尾问题。

修改风险转换前先备份脚本。不要对未知目录批量执行行尾替换。

只修复目标脚本

确认备份后,在 Linux 上移除每行末尾的回车:

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

随后检查第一行应类似 #!/usr/bin/env bash,并确认脚本具有执行权限。若脚本不需要直接执行,也可以明确使用 bash deploy.sh

仍然失败时

  • 检查文件名是否含空格或不可见字符。
  • 确认当前目录与脚本实际路径一致。
  • 确认远端安装了 shebang 指定的解释器。
  • 避免在 PowerShell、Git Bash 和 WSL 间直接拼接路径。

成功标志

  • file deploy.sh 不再显示 CRLF。
  • cat -v 看不到 ^M
  • 最小命令可以执行,再恢复完整部署流程。