问题描述
在使用docker部署项目的时候,DockerFile中明明复制start.sh脚本了。但是一直报错,无法找到sh脚本。
exec /server/start.sh: no such file or directory
原因分析
在跨平台开发中,Windows和Unix/Linux系统在处理文件行尾换行符时存在差异。Windows系统使用回车(CR,即
\r)和换行(LF,即\n)两个字符作为行尾标识,而Unix/Linux系统仅使用换行(LF,即\n)。这种差异可能导致在Windows环境下编写的shell脚本在Unix/Linux系统上执行时出现错误。。
解决方案
一、使用sed命令删除^M字符
sed(Stream Editor)是一个流编辑器,可以用来执行文本替换、删除等操作。在Unix/Linux系统中,可以使用sed命令删除Windows行尾的回车(CR)字符。
因此我们可以使用sed命令通过正则表达式匹配并替换文本。对于行尾的回车字符,可以使用sed命令将其删除。
sed -i -e 's/\r$//' script.sh
二、用vi编辑器更改fileformat为unix
- 启动
vi编辑器:
vi script.sh
- 在
vi命令模式下,设置文件格式为unix:
:set fileformat=unix
- 保存并退出:
:wq
这样,`vi`编辑器会自动将文件的行尾字符转换为Unix/Linux系统兼容的格式。
三、使用dos2unix工具进行格式转换
dos2unix是一个专门用于转换文件格式的工具,可以将Windows格式的文件转换为Unix/Linux格式。使用这个工具之前,要确保系统上已经装好dos2unix。
RUN apt-get update && apt-get install -y dos2unix
dos2unix script.sh