正常运行目录中的所有脚本

正常运行目录中的所有脚本

我想创建一个 shell 脚本,依次运行它在给定目录中找到的所有脚本。

应遵守以下限制:

  • 脚本应该按字母顺序运行

  • 应省略备份脚本(又名看起来像典型备份脚本的脚本,如foo~或)。bar.bak

  • 参数应该传递给脚本

  • 仅应运行“脚本”(可执行文件和可能指向可执行文件的符号链接)

我发现这是分割配置(在我的 Debian 系统上)中的常见模式,我非常喜欢它。

现在我创建了一个简单的启动脚本,它似乎可以完成所有这些操作:

#!/bin/sh

SCRIPTDIR=/etc/scripts/up.d

for SCRIPT in "${SCRIPTDIR}/"*
do
  case "${SCRIPT}" in
  *~|*.bak)
     continue
  ;;
  *)
     if [ -f "${SCRIPT}" -a -x "${SCRIPT}" ]; then
       "${SCRIPT}" $@
     fi
  ;;
  esac
done

由于这种模式如此常见,我想知道我的系统上是否已经安装了这样的脚本,据说它比我的系统进行了更多的测试和错误修复。但我找不到。

您知道 Debian 系统上有这样的启动脚本吗?

答案1

您可以使用run-parts命令:

run-parts  runs  all  the  executable  files  named  within constraints
described  below,  found  in  directory  directory.   Other  files  and
directories are silently ignored.

If neither the --lsbsysinit option nor the --regex option is given then
the names must consist entirely of ASCII upper- and lower-case letters,
ASCII digits, ASCII underscores, and ASCII minus-hyphens.

默认限制会忽略带有扩展名、波形符等的文件。您可以通过将多个选项传递给 来传递多个--arg参数run-parts

-a, --arg=argument
        pass  argument to the scripts.  Use --arg once for each argument
        you want passed.

您可以构建要传递的参数列表:

for i; do args+=(" -a '$i'"); done
run-parts ... "${args[@]}" ...

例如,默认情况下使用它crontab来执行各个目录中的脚本cron.*

相关内容