我想创建一个 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.*
。