我使用以下方法在当前 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
以一种只能处理一个文件的方式进行评估,而除此之外的任何其他文件都将被评估作为第一个文件的参数(大括号集{}
对此没有帮助)。
我的印象是这与相反是一样bash
的source
。
答案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 的方式以及没有匹配项时执行的操作方面会有所不同。)