设置两个或多个文件以方便阅读的方式执行(通过源代码)

设置两个或多个文件以方便阅读的方式执行(通过源代码)

我使用以下方法在当前 Bash 会话中执行 Bash 脚本文件的集合:

source ~/myScripts/{assignments.sh,nginx_conf.sh,php_conf.sh,drush_install.sh}

我觉得维护起来很不舒服。一些垂直收集更好。伪代码:

assignments.sh
nginx_conf.sh
php_conf.sh
drush_install.sh

你会如何垂直地做到这一点?

顺便说一句,我不确定这里的源文档是否像这个是最好的办法。

更新

我现在明白,我的一行source操作注定会失败,因为从 Bash 4.3.48(1) 开始,Bash 解释器source以一种只能处理一个文件的方式进行评估,而除此之外的任何其他文件都将被评估作为第一个文件的参数(大括号集{}对此没有帮助)。

我的印象是这与相反是一样bashsource

答案1

Heredoc 将每个文件名放在自己的行上,没有任何其他内容(尽管假设文件名不包含像换行符这样的疯狂内容),并允许文件名的特定顺序:

while read f; do
   source ~/myScripts/"$f"
done <<SRC_LIST
assignments.sh
nginx_conf.sh
php_conf.sh
drush_install.sh
so_forth.sh
SRC_LIST

source file [arguments]这也避免了后续文件名被视为参数的问题assignments.sh(除非您确实意味着后续文件名是参数??)。该列表需要手动与文件系统上的内容保持同步。

另一种选择是跳过列出文件的单调乏味,并将它们放入 glob 中;这假设目录中的所有匹配文件都可以而且应该来源(因此不得混合其他*.sh不得来源的随机文件)。然而,当没有文件与 glob 匹配时,这种情况会变得复杂,在这种情况下,bash默认情况下将传递 in 的文字文件名~/myScripts/*.sh来获取源,因此必须解决这个问题(暂时,如果需要),并且如果没有任何源,则不会获取任何源没有匹配项:

REVERT=$(shopt -p nullglob)
shopt -s nullglob
for f in ~/myScripts/*.sh; do
    source "$f"
done
$REVERT

使用此方法,如果需要获取文件的顺序,则需要以 glob 以正确的顺序匹配文件名的方式命名文件名。(在 ZSH 中,不需要调用,因为shopt只需for f in ~/myScripts/*.sh(N); do执行空 glob。其他 shell 在处理 glob 的方式以及没有匹配项时执行的操作方面会有所不同。)

相关内容