如何以最小的、干燥的、漂亮的方式在同一目录中执行多个文件?

use*_*970 3 executable shell-script wildcards subshell syntax

我使用 Ubuntu 16.04 并且我有一个本地化文件,一个执行许多文件的文件,这是我将自己的 GitHub 项目下载到我的机器后得到的。

该文件包含一个 Bash 脚本,名为localize.sh. 我通过~/${repo}/localize.sh.

该文件包含许多行,所有行都具有相同的基本模式(见下文),以在子会话中执行所有相关文件。

这是该文件的实际内容:

#!/bin/bash
~/${repo}/apt/security.sh
~/${repo}/apt/lemp.sh
~/${repo}/apt/certbot.sh
~/${repo}/apt/misc.sh

~/${repo}/third-party/pma.sh
~/${repo}/third-party/wp-cli.sh

~/${repo}/conf/nginx.sh
~/${repo}/conf/php.sh
~/${repo}/conf/crontab.sh

~/${repo}/local/tdm.sh
Run Code Online (Sandbox Code Playgroud)

人们可以注意到重复的~/${repo}/模式。

这不是一个大问题,但减少这些冗余字符仍然会很好,因为这个文件应该变得更大。

实现 DRY 的最简单方法是什么(不要重复该代码的自己版本?

在这种情况下,我个人不想使用一条长线。

编辑:原则上,列出的目录中没有也不应该有任何其他文件,除了localize.sh.


此外,可能 namelocalize.sh以及调用文件的操作localization是一种不好的方法;如果你认为它不好,请在旁注中批评我。

Ste*_*itt 8

不清楚您是否正在运行相关目录中的所有脚本,但如果是,您可能会发现run-parts有用:

for subdir in apt third-party conf local
do
    run-parts --regex '\.sh$' ~/${repo}/${subdir}
done
Run Code Online (Sandbox Code Playgroud)

请注意,这将在每个目录中按字母数字顺序运行脚本,因此如果子目录中的顺序很重要,您需要重命名它们(或编号)。您可以run-parts通过使用以下--test选项运行它来提前查看将执行的操作:

apt/certbot.sh
apt/lemp.sh
apt/misc.sh
apt/security.sh
third-party/pma.sh
third-party/wp-cli.sh
conf/crontab.sh
conf/nginx.sh
conf/php.sh
local/tdm.sh
Run Code Online (Sandbox Code Playgroud)