通过 shell 文件名完成获取多个文件

通过 shell 文件名完成获取多个文件

我正在尝试启用 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

它将负责从相关完成目录中获取任何内容,同时还会添加大量有用的完成内容。

相关内容