我有两个几乎相同的脚本test.sh,并且updated_pack.sh在 Linux 上。两者都包含字符串:sudo apt-get upgrade -y >> /var/log/update_script.log.
该脚本test.sh重 54 个字节(根据ls -l)并正常运行。反过来,该脚本update_script.sh重 55 个字节并且没有启动,从而给出错误:
Permission deniedin 1: /var/log/updated_script.log
两个文件具有相同的权限,包括运行权限。
执行后hexdump发现两个文件几乎一样,除了最后两个字节。最后那几个角色是什么?
截屏:

这是关于换行符的。并且很可能从 Windows 复制并粘贴到 Linux。
如果文件
test.sh是通过 Linux 上的“在某些文本编辑器中键入字符”创建的(无复制/粘贴),并且严格包含:那么我们有
它对应于您成功运行的文件。
现在来点魔法。我们取上面的文件
test.sh并将其中现有的Unix 字符LF(Line Feed) 换行符更改\n为CR(Carriage Return)\r:我们看到最后一个代码 已
0a67更改为0d67,这就是您在屏幕截图中实际拥有的内容。现在让我们弄清楚它是什么
000a。LF嗯...这就是(Line Feed)的 Unicode 字符。现在我们开始了解大致发生了什么:该序列
CRLF用于 Windows 中的换行符。这意味着在某些时候,以无与伦比的形式从一个来源复制到另一个来源,甚至使用 Unicode,这一切都落在了粉丝身上。幸运的是风扇是标准化的,只是不会启动。脚本对这些东西很敏感,行应该以
LF. 理由:POSIX 3.206:
POSIX 3.243
解决方案:使 Linux shell 脚本中的换行符正确:
\n.另一个有用的读物: