我有这个在 Centos 上使用多年的脚本。我现在在 Raspberry Pi 上调用相同的脚本,但出现此错误:
/media/Backups/backup_all.sh: 2: /media/Backups/backup_all.sh: source: not found
/media/Backups/backup_all.sh: 7: /media/Backups/backup_all.sh: function: not found
这是位于名为 backup_all.sh 的文件中脚本。我使用 sh backup_all.sh 从命令行和 cron 调用它。
#!/bin/sh
function backup
{
sh "/media/Backups/backup.sh" $1 $2 filter-list.txt
}
backup myserverhostname.com 22
我也尝试将源 backup.sh 或“source /media/Backups/backup.sh”放在顶部,但没有作用。
奇怪的是,它确实调用了 backup.sh 脚本,因为我从中得到了更多错误。
如果我直接从命令行调用源脚本(例如 sh“/media/Backups/backup.sh”myserverhostname.com 22 filter-list.txt)它可以正常运行,所以我认为其中没有错误。
如果我不使用该函数,而只是在 backup_all.sh 文件中调用 sh "/media/Backups/backup.sh" myserver 22 filter-list.txt,那么也可以正常工作。所以似乎只是在函数中使用时才这样。
为便于了解,我将脚本包含在另一个脚本中,因为我要遍历许多服务器来运行此功能,因此我多次调用此文件中的备份功能,这比为每个服务器专门调用它更容易。但为了使其正常工作,我删除了该功能并分别调用每一行,但最好找出为什么我不能使用与 Centos 上相同的功能。
答案1
它看起来像是/media/Backups/backup.sh
一个 Bash 脚本,而不是标准 (POSIX) shell 脚本。同样,的语法backup_all.sh
仅适用于 Bash。
在 Bash 中source
是内置命令,function
是 shell 关键字,但这些并未在sh 的 POSIX 标准,shell 命令解释器。脚本中的 shebang#!/bin/sh
指示内核使用什么/bin/sh
来解释脚本。
这两个 shell 脚本之所以可以在 CentOS 上运行,是因为基于 Red Hat 的发行版会创建/bin/sh
指向 的符号链接/bin/bash
。Bash 与 POSIX 基本兼容,但会以多种方式扩展其功能。在最近的 Debian 衍生产品(例如 Raspbian)中,/bin/sh
会创建指向 的符号链接/bin/dash
,这是一个兼容性更严格的 POSIX shell(但也比 Bash 更轻量且速度更快)。这就是脚本解释器抛出以下错误的原因:
/media/Backups/backup_all.sh: 2: /media/Backups/backup_all.sh: source: not found
/media/Backups/backup_all.sh: 7: /media/Backups/backup_all.sh: function: not found
可以通过以下方法修复:
backup()
在您的函数中明确指定 Bash 作为解释器bash /media/Backups/backup.sh "$1" "$2" filter-list.txt
(请注意变量已加引号)。backup_all.sh
明确指定 Bash 作为(和backup.sh
) 的shebang#!/bin/bash
或者,重写两个脚本以兼容 POSIX 并继续用作/bin/sh
解释器。请参阅 Ubuntu wiki 文章,破折号作为 /bin/sh了解更多信息。