use*_*970 0 array executable integrity
我使用以下方式在当前 Bash 会话中执行一组 Bash 脚本文件:
source ~/myScripts/{assignments.sh,nginx_conf.sh,php_conf.sh,drush_install.sh}
Run Code Online (Sandbox Code Playgroud)
我觉得维护起来不舒服。一些垂直收集更好。伪代码:
assignments.sh
nginx_conf.sh
php_conf.sh
drush_install.sh
Run Code Online (Sandbox Code Playgroud)
你会如何垂直地做到这一点?
顺便说一句,我不确定像这样的源文件是最好的方法。
我现在明白我的单行source
操作注定要失败,因为从 Bash 4.3.48(1) 开始,Bash 解释器的评估source
方式是它只能处理一个文件,而超出它的任何其他文件都将被评估作为第一个文件的参数(大括号集{}
对此无济于事)。
我得到的印象,这是一样的用bash
代替source
。
一个 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
Run Code Online (Sandbox Code Playgroud)
这也避免了source file [arguments]
后续文件名将被视为参数的问题assignments.sh
(除非您确实将后续文件名视为参数??)。该列表需要手动与文件系统上的内容保持同步。
另一种选择是跳过列出文件并将它们放入的单调乏味的工作;这假设目录中的所有匹配文件都可以并且应该来自(因此不会混入其他*.sh
不得作为来源的随机文件)。然而,当没有文件与 glob 匹配时,这会变得复杂,在这种情况下bash
,默认情况下将传递~/myScripts/*.sh
要获取的in的文字文件名,因此必须解决(临时,如果需要)并且没有任何来源,如果没有匹配项:
REVERT=$(shopt -p nullglob)
shopt -s nullglob
for f in ~/myScripts/*.sh; do
source "$f"
done
$REVERT
Run Code Online (Sandbox Code Playgroud)
使用这种方法,如果需要文件来源的顺序,文件名需要以 glob 以正确顺序匹配它们的方式命名。(在 ZSH 中,不需要shopt
调用,而是for f in ~/myScripts/*.sh(N); do
足以执行一个空的 glob。其他 shell 在处理 glob 的方式以及在没有任何匹配时要做什么方面会有所不同。)