我有一堆 bash 完成文件
/usr/local/etc/bash_completion.d
其中大多数脚本的底部都有类似的内容:
complete -F _tmux tmux
Run Code Online (Sandbox Code Playgroud)
以上是针对 tmux 的。
我的问题是 - 默认情况下,这些文件看起来不像 bash?我在网上看到一些关于执行此类操作的说明:
for f in '/usr/local/etc/bash_completion.d/'*; do
source "$f"
done;
Run Code Online (Sandbox Code Playgroud)
我需要手动执行此操作还是 bash 应该开箱即用执行此操作?
我试图在tcsh和/或bash中设置目录完成(两者都在我的网站上使用)稍微扭曲:对于特定命令"foo",我想完成使用自定义函数来匹配first/-deimited term到实际子树节点,然后按照正常目录完成任何连续的术语.它是cdpath和completion的组合,或者我想一种目录完成形式,其中起点由完成脚本控制.它的工作原理如下:
$ foo xxx<TAB>
(custom completion function produces choices it finds at arbitrary levels in the dir tree)
xxxYYY xxxZZZ xxxBLAH ...
foo xxxYYY/<TAB>
(normal directory completion proceeds from this point on, to produce something like:)
foo scene/shot/element/workspace/user/...
Run Code Online (Sandbox Code Playgroud)
我们想这样做是因为我们有一个大型的生产开发树(这是一个CGI生产设施),精通外壳的用户一直在导航和跳跃.抱怨是树的上层是繁琐和多余的; 他们只需要在第一个学期快速搜索,找到可能的"头部"选择并从那里完成目录.似乎可编程完成可以提供一种方法来实现这一点,但它变得相当难以捉摸.
我做了几次自定义bash和tcsh完成的尝试,但是我得到的最接近的是一种"单词完成"形式,用户必须将目录级别视为带空格的单独单词(例如foo scene/shot)/element/workspace/...).我可以继续攻击我目前的脚本 - 但我一直想知道是否有一些我不理解的东西 - 这是我第一次尝试完成程序,而且这些文档和示例在shell书籍和互联网上相当薄弱.如果有任何完成大师可以让我走上正轨,我会很感激.
FWIW:这是我到目前为止所得到的(首先是tcsh,然后是bash).请注意,静态根"/ root/sub1/sub2/sub3"只是搜索功能的占位符,可以在不同级别找到不同的匹配项.如果我可以让它工作,我可以稍后进入搜索功能.同样,两个示例都执行单词完成,这需要用户在每个匹配的术语后键入一个空格(我还必须删除函数中的空格以构造实际路径,哎呀!)
TCSH示例(注意该函数实际上是一个bash脚本):
complete complete_p2 'C@*@`./complete.p2.list.bash $:1 $:2 $:3 $:4 $:5 $:6 $:7 $:8 $:9`@@'
#!/bin/bash --norc
# complete.p2.list.bash - Completion prototype "p2" for shotc command
# Remove spaces from input arguments
ppath=`echo …Run Code Online (Sandbox Code Playgroud) 我曾经能够键入以下内容:
$> ./foo --arg = <TAB>
其中foo是我写的任何程序,它会给我一个当前目录中的文件列表,就像tab-completion通常一样.我没有必要对/ etc/bash_completion进行任何更改.
然而,最近,由于一些未知的原因,这已经消失了.有谁知道如何重新启用此功能?
FWIW,这仍然是正确的事情(注意缺少等号):
$> ./foo --arg <TAB>
我正在尝试修改bash完整属性.
我可以这样排除命令的文件扩展名:
complete -f -X '*hi' vim
Run Code Online (Sandbox Code Playgroud)
我想指定两个文件名以进行排除.我该怎么做呢?
注意:以下命令不起作用.
complete -f -X '(*hi|*o)' vim
Run Code Online (Sandbox Code Playgroud) 我在python中编写命令行工具并使用pip来分发它.我编写了一些脚本(一个用于bash,一个用于zsh)以允许工具完成选项卡.当有人进行pip安装时,有没有办法让pip安装这些脚本?
例如:我有一个completion.bash文件.有人的时候
pip安装mypackage
它还将获取bash文件.
我很确定我可以通过将脚本放在setup.py脚本的data_files部分中来为linux和bash执行此操作.
data_file=[
('/etc/bash_completion.d', ['bin/completion.bash'])
],
Run Code Online (Sandbox Code Playgroud)
但是我怎么能这样做,所以它是平台和shell独立的?我需要它在bash和zsh中为mac/linux工作.如果可能,甚至支持窗口.
这可能吗?如果是这样,怎么样?
如果重要,这是我的bash脚本:
_foo_complete() {
COMPREPLY=()
local words=( "${COMP_WORDS[@]}" )
local word="${COMP_WORDS[COMP_CWORD]}"
words=("${words[@]:1}")
local completions="$(foo completer --cmplt=\""${words[*]}"\")"
COMPREPLY=( $(compgen -W "$completions" -- "$word") )
}
complete -F _foo_complete foo
Run Code Online (Sandbox Code Playgroud)
我目前正在通过运行来安装它 source completion.bash
例如,linux上有rar的bash-completion,我想扩展,为同一个命令做更多的补全——rar,也许是我自己的文件扩展名,但我不想碰已经存在的补全脚本,如何开始吧?
谢谢!
检测 bash 完成包是否加载到我的 bash shell 中的方法是什么?从 2.1 版bash-completion(包含在 Debian 8 中)开始,没有 shell 变量来指示这一点,除了BASH_COMPLETION_COMPAT_DIR,这不是一个可靠的指标。
在bash提示符下,我可以执行此副本
cp file.txt test1.txt
但是如果我尝试将file.txt复制到这样的几个文件中
cp file.txt test{2..4}.txt
Run Code Online (Sandbox Code Playgroud)
我收到错误
cp:target`test4.txt'不是目录
无法kubectl在 Mac 上完成 bash。我bash-completion用brewie安装brew install bash-completion,然后按照安装说明,将其添加到~/.bash_profile:
if [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi
kubectl -bash: _init_completion: command not found但重新获取配置文件后仍然出现错误。
当“read -e”在 bash 中处于活动状态时,当前的制表符完成似乎仅匹配文件名:
read -e
[[TabTab]]
abc.txt bcd.txt cde.txt
Run Code Online (Sandbox Code Playgroud)
我希望完成是由我定义的一组字符串,而文件/目录/主机名完成等应在“read -e”期间停用。
在脚本之外
complete -W 'string1 string2 string3' -E
Run Code Online (Sandbox Code Playgroud)
效果很好,但在使用“read -e”时我无法在脚本内完成这种工作。
bash-completion ×10
bash ×8
linux ×2
completion ×1
kubernetes ×1
macos ×1
pip ×1
python ×1
readline ×1
shell ×1
tcsh ×1