news 2026/6/23 16:22:00

执行 install.sh 报错 `env: ‘bash\r‘: No such file or directory` 怎么解决?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
执行 install.sh 报错 `env: ‘bash\r‘: No such file or directory` 怎么解决?

适用场景:
Docker / Jenkins / Linux 容器中执行.sh脚本失败
报错:env: ‘bash\r’: No such file or directory


一、问题现象(很多人都会遇到)

在 Docker 容器或 Jenkins 容器中,执行脚本:

chmod+x install.sh ./install.sh

结果报错:

env: ‘bash\r’: No such file or directory env: use -[v]S to pass options in shebang lines

看起来像是:

  • bash 不存在?
  • 权限不对?
  • Jenkins / Docker 有问题?

👉其实都不是。


二、根本原因(重点,一定要看)

✅ 真正原因:脚本是 Windows 换行符(CRLF)格式

Linux / Docker 使用的是:

  • LF(\n)换行

而 Windows 常见的是:

  • CRLF(\r\n)

当脚本第一行是:

#!/usr/bin/env bash\r

Linux 会把它理解成:

bash\r (一个不存在的命令)

于是就报了这个经典错误:

env: ‘bash\r’: No such file or directory

三、如何确认是不是这个问题(可选)

可以用下面命令查看隐藏字符:

sed-n'1l'install.sh

如果看到:

#!/usr/bin/env bash\r$

那就100% 确认是 CRLF 换行符问题


四、解决办法(3 种,任选一种)

✅ 方法 1(最推荐):使用sed转换格式

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

然后再执行:

./install.sh

✔ 通用
✔ 不依赖额外工具
✔ Docker / Jenkins 都适用


✅ 方法 2:使用dos2unix(如果系统有)

dos2unix install.sh ./install.sh

注意:不是所有容器里都有dos2unix


✅ 方法 3:直接用 bash 执行(临时方案)

bashinstall.sh

这种方式有时能绕过 shebang 问题,但不如前两种彻底


五、为什么很容易踩这个坑?

常见原因包括:

  • Windows 浏览器中下载.sh
  • 记事本 / VS Code(CRLF)打开并保存
  • 从 Windows 主机复制脚本到 Linux / Docker
  • Jenkins 容器里直接粘贴脚本

👉 这些都会自动把 LF 转成 CRLF


六、推荐的「正确下载脚本姿势」

✅ 方式 1:直接 curl + bash(官方常用)

curl-fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh|bash

✅ 方式 2:先下载,再处理换行符

curl-o install.sh https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.shsed-i's/\r$//'install.shbashinstall.sh

七、常见误区总结(新手必看)

错误操作原因
sudo ./install.shDocker 容器里通常没有 sudo
一直chmod +x权限不是根因
以为是 bash 没装实际是换行符问题
以为 Jenkins 有 bug和 Jenkins 无关

八、一句话总结(可以直接记住)

env: 'bash\r'报错 ≠ bash 不存在
而是脚本是 Windows 格式(CRLF),
sed -i 's/\r$//' 文件名即可解决。


九、写在最后(经验建议)

Linux / Docker / Jenkins环境中:

  • .sh脚本永远只用 LF
  • 不要用 Windows 记事本编辑
  • 下载脚本尽量用curl / wget
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 20:30:51

Part 10|我给这套系统划的第一个边界

在决定从业务边界开始拆系统之后,我很快遇到了一个非常具体的问题。 这个问题不是“模块怎么拆”, 而是:某些逻辑,到底该不该跨过模块边界?这个问题如果不先想清楚, 后面的设计会非常难受。一、这个问题&am…

作者头像 李华
网站建设 2026/6/22 22:47:16

agent-zh.md

你是一个 AI 助手,帮助用户完成各种任务,包括编程、研究和分析。 核心角色 你的核心角色和行为可能会根据用户反馈和指示进行更新。当用户告诉你应该如何表现或你的角色应该是什么时,立即更新此记忆文件以反映该指导。 记忆优先协议 你可以访…

作者头像 李华
网站建设 2026/6/23 3:04:58

为什么过滤 rtmpt 而不是 rtmp?

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。 😊 座右铭:不…

作者头像 李华
网站建设 2026/6/17 15:33:03

Navicat x 达梦技术指引 | 启用和配置AI助手

近期,Navicat 宣布正式支持国产达梦数据库。Navicat 旗下全能工具 支持达梦用户的全方位管理开发需求,而轻量化免费的 则满足小型和独立开发者的基础需求。 Navicat Premium 自版本 17.3 开始支持达梦 DM8 或以上版本。它支持的系统有 Windows、Linux …

作者头像 李华
网站建设 2026/6/23 2:00:15

Transformer的注意力权重的理解

""" Transformer 注意力权重分析工具 详细解析注意力矩阵的含义和使用方法 """import torch import torch.nn as nn import numpy as np import math# # 简化的多头注意力(用于演示) # class SimpleMultiHeadAttention(…

作者头像 李华
网站建设 2026/6/16 20:04:51

解构 Codigger:从内核到无限生态的“进化阶梯”

当下开发工具市场繁杂又高度同质化,Codigger 却格外亮眼。它没有止步于单点工具的定位,而是成长为一个设计精巧、层层推进的技术有机体。从架构全景来看,它更像一套严谨的进化阶梯,六大核心层级彼此联动,共同构建出强悍…

作者头像 李华