如何在 Raspbian 上调用 bash 脚本中的函数?

如何在 Raspbian 上调用 bash 脚本中的函数?

我有这个在 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

可以通过以下方法修复:

  1. backup()在您的函数中明确指定 Bash 作为解释器bash /media/Backups/backup.sh "$1" "$2" filter-list.txt(请注意变量已加引号)。
  2. backup_all.sh明确指定 Bash 作为(和backup.sh) 的shebang

    #!/bin/bash
    

或者,重写两个脚本以兼容 POSIX 并继续用作/bin/sh解释器。请参阅 Ubuntu wiki 文章,破折号作为 /bin/sh了解更多信息。

相关内容