我有一个小 sh 脚本,用于备份到远程服务器。它在 Ubuntu 16.04 上工作了多年,但现在在 18.04 上却失败了。起初我认为这是 anacron 的问题,但现在我认为这是脚本本身或 dash 的问题。这是正在发生的事情:
stefan@stefan-Aspire-F5-573T:/etc/cron.daily$ sudo chmod +x rsync-doc-script
[sudo] Mot de passe de stefan :
stefan@stefan-Aspire-F5-573T:/etc/cron.daily$ ./rsync-doc-script
/bin/sh: 0: Can't open *
stefan@stefan-Aspire-F5-573T:/etc/cron.daily$ sh rsync-doc-script
opening connection using: ssh -i /home/stefan/.ssh/id_rsa -l totem MouseHouse rsync --server -vvlogDtprze.iLsfxC . /totembackup/totemdoc (11 args)
ssh: connect to host mousehouse port 22: Connection refused
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(235) [sender=3.1.2]
stefan@stefan-Aspire-F5-573T:/etc/cron.daily$
该错误can't open *
阻止脚本在运行时正确运行run-parts
。为什么会出现这个错误?
在最后一行中,当脚本运行时,它无法建立连接,这无关紧要。服务器现在已关闭。
这是脚本:
#!/bin/sh *
rsync -azvv -e "ssh -i /home/stefan/.ssh/id_rsa" /home/stefan/Documents/ totem@MouseHouse:/totembackup/totemdoc
我不能确定,但看起来你在第一行有一个错字,
*
右边有一个迷路。^^^ 向右滚动查看。
例子
直接运行:
运行方式
sh
:一般建议
通常建议在 shebang 中使用您期望的确切外壳。如果您怀疑遇到了您怀疑
dash
或正在使用其他 shell 的问题,您始终可以通过将 shebang 更改#!/bin/sh
为您的 shebang 来明确您的 shebang#!/bin/bash
。以上是基于您在下面的评论:
当您执行一个不是二进制可执行文件而是带有 shebang 的文本文件(文件的第一行以 开头)的文件 1 时,
#!
内核(没有任何 shell 的帮助)构建一个命令,即 shebang 行(之后的部分#!
) 后跟原始的用户级命令行。例如,如果doc-script
开始它被调用
然后内核构建并执行以下命令:
这会导致 shell 读取和解释
doc-script
脚本,设置xtrace (-x
) 选项,并使用$1
=bashful
和$2
=dopey
。(自然$0
是./doc-script
。)如果原始用户提供的命令是然后处理该命令的外壳(为简单起见,我们假设这是在用户终端上运行的交互式外壳)可能会将其扩展为
因此内核构建并执行以下命令:
但请记住:shebang 行的处理是由内核完成的, 而不是由 shell完成的。 因此,如果 shebang 是
那么最终的构造命令是
因为这里不会发生全局扩展。就外壳而言,这看起来像是用户键入的
并且,因为
*
不以 开头-
,shell 将其解释为文件名,因此它尝试运行名为 =*
、 = 、 = 、 = 等 的脚本。而且,由于没有名为 的脚本,因此失败。 __________ 1 我假设该进程具有执行文件所需的权限。$0
*
$1
./doc-script
$2
bashful
$3
dopey
*