运行在 shell 中作为脚本运行的命令

运行在 shell 中作为脚本运行的命令

在 shell 中运行以下命令不会出现问题:

ssh user@machine systemctl status my-service.service
ssh user@machine sudo systemctl stop my-service.service
scp -r ./my-service/* user@machine:/home/user/my-service
ssh user@machine chmod +x /home/user/my-service/my-service
ssh user@machine sudo systemctl start my-service.service
ssh user@machine sudo systemctl status my-service.service

但是,将其放入deploy.sh文件中会导致上述任何内容都无法执行。

错误:

  • 无效的单元名称“my-service”被转义为“my-service \x0d”(也许您应该使用 systemd-escape?)
  • 找不到单元 my-service\x0d.service。
  • 无效的单元名称“my-service.service”被转义为“my-service.service\x0d”(也许您应该使用 systemd-escape?)
  • 无法停止 my-service\x0d.service:单元 my-service.service\x0d.service 未加载。:没有此文件或目录 nlock/
  • chmod:无法访问'/home/user/my-service/my-service'$'\r':没有此文件或目录
  • 无效的单元名称“my-service.service”被转义为“my-service.service\x0d”(也许您应该使用 systemd-escape?)
  • 无法启动 my-service.service\x0d.service:未找到单元 my-service.service\x0d.service。无效单元名称“my-service.service”被转义为“my-service.service\x0d”(也许您应该使用 systemd-escape?)
  • 找不到单元 my-service.service\x0d.service。

有些被拆散了。这似乎与转义有关。出于某种原因,在行尾添加一个空格可以让它工作,但仍然会出现错误。

对错误进行谷歌搜索会显示一些关于使用--并将其与尾随空格一起添加使得一些命令起作用但仍然会出现转义错误的搜索结果。

答案1

我敢打赌你编辑过这个文件,或者从视窗机器。

Linux 使用 \x0a(ASCII 代码 10)来分隔文件(或脚本)内的行。Windows
使用 \x0d(“回车符”,ASCII 代码 13)和 \x0a(“换行符”,ASCII 代码 10)的组合来执行相同的工作。

将 Windows 编辑的文件放入 Linux 机器,它会看到每一行因为末尾有一个多余的 \x0d。

给自己一个体面的Windows 编辑器 (记事本++是免费的,强烈推荐)或学习如何使用。当然,它有自己的学习曲线,但它的一些功能可能会让你大吃一惊!

相关内容