我正在尝试启用 Homebrew 命令的自动完成功能。Homebrew 会自动创建文件夹bash_completion.d
并将所有完成文件符号链接到那里。
$ ls -a `brew --prefix`/etc/bash_completion.d/
. .. brew_bash_completion.sh git-completion.bash
如你所见,我有brew
和的补全git
。因此我尝试运行文件:
[ -d `brew --prefix`/etc/bash_completion.d ] && source `brew --prefix`/etc/bash_completion.d/*
这是我的~/.bash_profile
,我希望它能获取中的所有文件bash_completion.d
。当我稍后在终端中尝试它时,只有完成才有效brew
。
我是否遗漏了什么?
答案1
帮助source
揭开了这个谜团:
source: source filename [arguments]
Read and execute commands from FILENAME and return. The pathnames
in $PATH are used to find the directory containing FILENAME. If any
ARGUMENTS are supplied, they become the positional parameters when
FILENAME is executed.
这意味着当你给它提供通过 glob 生成的文件名列表时,只有第一个是源文件,而其后的所有文件名都被视为其参数。要获取完成目录中的所有文件,你需要循环遍历它,即
for f in "$(brew --prefix)"/etc/bash_completion.d/*; do source "$f"; done
然而,当你使用 homebrew 的 bash 完成时,有一个更好的方法:简单地
source "$(brew --prefix)"/etc/bash_completion
它将负责从相关完成目录中获取任何内容,同时还会添加大量有用的完成内容。