svn
之类的程序并在Gnome终端中输入以下内容时: 是否可以在自定义bash脚本中执行类似的操作?
#1 楼
您可以使用可编程完成。请看/etc/bash_completion
和/etc/bash_completion.d/*
的一些示例。评论
包括与问题直接相关的简单示例如何?
–MountainX
2013年6月23日在21:14
Ubuntu 16的实际脚本位于/ usr / share / bash-completion / completions /
–彼得
17年9月26日在21:26
Imo,示例应该包含在答案中,而不是链接中。
–billynoah
18年3月30日在18:24
我相信这个平台应该是可以通过简单的Google搜索找到的完整文档的更实用的替代品。转储文档链接无济于事。包含锚点的链接肯定不会有太大变化。
–timuçin
18年6月24日在8:59
提供的链接已经具有该链接-今天可能会,但明天可能不会。或明年。或十年后。无论您对文档仍然有何建议,由于这些原因,Stack Overflow都不鼓励仅链接的答案。
–利亚姆·道森(Liam Dawson)
19年1月20日在9:23
#2 楼
您必须创建一个新文件:/etc/bash_completion.d/foo
要进行静态自动完成(例如
--help
/ --verbose
),请添加以下文件:_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo foo
COMP_WORDS
是一个包含当前命令行中所有单个单词的数组。COMP_CWORD
是包含当前光标位置的单词的索引。COMPREPLY
是一个数组变量, Bash读取可能的补全。,
compgen
命令从--help
,--verbose
和--version
返回与当前单词"${cur}"
匹配的元素数组:compgen -W "--help --verbose --version" -- "<userinput>"
源
评论
提示:如果某人想要不以-开头的单词的建议,而不必开始输入目标单词就显示它们,只需删除if和then行。
–塞德里克·赖兴巴赫
15 Sep 16'9:23
教程-创建bash完成脚本
–拉撒路(Lazarus Lazaridis)
18 Mar 16 '18 at 11:16
答案中的路径似乎已过时。创建完成后,用户完成脚本可以存储在〜/ .local / share / bash-completion / completions /中。系统完成脚本通常存储在/ usr / share / bash-completion / completions /中。
–触角
20/11/28在15:52
#3 楼
这是一个完整的教程。让我们看一个示例脚本
admin.sh
,您希望对其执行自动完成操作。#!/bin/bash
while [ $# -gt 0 ]; do
arg=
case $arg in
option_1)
# do_option_1
;;
option_2)
# do_option_2
;;
shortlist)
echo option_1 option_2 shortlist
;;
*)
echo Wrong option
;;
esac
shift
done
请注意选项
shortlist
。使用此选项调用脚本将打印出该脚本的所有可能选项。这里有自动完成脚本:您要添加自动完成功能。您需要做的就是将您的自动完成脚本添加为bashrc,例如
_script()
{
_script_commands=$(/path/to/your/script.sh shortlist)
local cur
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )
return 0
}
complete -o nospace -F _script ./admin.sh
或将其复制到
/etc/bash.completion.d
评论
-o nospace选项有什么作用?
–安德鲁·拉玛拉(Andrew Lamarra)
17年11月11日在3:09
@AndrewLamarra -o nospace防止在成功完成之后插入空格。 (参考)
–触角
20-11-28在15:55
答案中的路径似乎已过时,因此在很大程度上不需要采购。用户完成脚本来自〜/ .local / share / bash-completion / completions /;该目录可以由用户创建。系统完成脚本通常存储在/ usr / share / bash-completion / completions /中。
–触角
20/11/28在16:00
#4 楼
所有的bash完成都存储在/etc/bash_completion.d/
中。因此,如果要使用bash_completion构建软件,则值得deb / make install在该目录中放置一个文件,其中包含软件名称。这是Rsync的bash完成脚本示例:最简单的示例之一是rrdtool
文件。评论
我们可以配置完井以从其他位置加载吗? IE浏览器〜/ .local
–克里斯
14年7月31日在16:14
是的,您可以在任意位置放置这样的文件,然后在〜/ .bashrc中放置源〜/ .local / mycrazycompletion。
– Stefano Palazzo
16 Mar 22 '16 at 5:40
@Chris请参阅Bash完成常见问题解答中的说明
– jarno
19年1月20日在12:14
如今,大多数补全位于命令pkg-config --variable = completionsdir bash-completion`给出的目录中,该目录是上面链接的Bash Completion FAQ给出的建议。
– jarno
19年1月20日在12:20
答案中的路径似乎已过时。按照此常见问题解答,用户完成脚本来自〜/ .local / share / bash-completion / completions /;该目录可以由用户创建。系统完成脚本通常存储在/ usr / share / bash-completion / completions /中。
–触角
20-11-28在16:02
#5 楼
如果您想要的只是一个简单的基于单词的自动完成功能(因此没有子命令完成或任何其他操作),则complete
命令具有一个-W
选项,可以执行正确的操作。例如,我有以下内容我的.bashrc
中的行可以自动完成一个名为jupyter的程序:# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'
现在
jupyter <TAB> <TAB>
对我来说自动完成。gnu.org上的文档对您有所帮助。
它似乎依赖于正确设置了
IFS
变量,但这对我没有任何问题。要添加文件名完成和默认的BASH完成,使用
-o
选项:complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'
要在zsh中使用此选项,请在
complete
中运行~/.zshrc
命令之前添加以下代码:# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
autoload bashcompinit
bashcompinit
fi
评论
我如何使用bash jupyter
– papampi
18-11-20在11:02
@papampi,我认为它仅在一个完成级别上起作用-我认为要在2层上完成,您需要上面更复杂的答案之一。另外,我最近阅读了有关bash完成的相当不错的教程。它并不能完全满足您的需求,但也许可以帮到您。祝好运!
–本
18年11月20日在21:05
评论
解释“ bash脚本”,是指在编辑脚本时?您想用它做什么?在控制台中使用脚本时
至于放置完成内容的位置,请参阅此问题以及那里已被接受的答案的注释。