bash-completion – 在第一次调用命令时定义的completion函数

前端之家收集整理的这篇文章主要介绍了bash-completion – 在第一次调用命令时定义的completion函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
添加了一个新的别名scp_using_rsync,它使用rsync通过SSH复制文件和某些选项.我想将scp的bash完成链接到此别名.

当我添加这一行时,它可以工作:

complete -o bashdefault -o default -o nospace -F _scp scp_using_rsync 2>/dev/null || complete -o default -o nospace -F _scp scp_using_rsync

唯一的问题是我注意到,_scp在我的bash环境中定义,只有在我尝试使用ssh / scp在该shell中至少执行一次tab-completion之后.所以,如果我在新shell中直接运行scp_using_rsync,我会得到_scp not found错误.

在为ssh或scp命令尝试制表符完成之前和之后,新shell中的typeset -F输出清楚地表明在第一次尝试制表符完成后定义了以下函数

$diff ~/.scratch/file1 ~/.scratch/file2
224a225,227
> declare -f _scp
> declare -f _scp_local_files
> declare -f _scp_remote_files
226a230
> declare -f _sftp
230a235,240
> declare -f _ssh
> declare -f _ssh_ciphers
> declare -f _ssh_macs
> declare -f _ssh_options
> declare -f _ssh_suboption
> declare -f _ssh_suboption_check

这些函数似乎在我的系统中的/usr/share / bash-completion / completions / ssh中定义.

这些是我的两个相互关联的问题:

> bash如何确定自动获取定义的位置,并在首次尝试完成时定义它们?
>我应该如何以类似的方式将scp_using_rsync的bash-completion链接到scp的bash完成?

Bash 4.1为complete,compgen和compopt添加了一个新的-D选项:

New complete/compgen/compopt -D option to define a `default’ completion:
a completion to be invoked on command for which no completion has been
defined
. If this function returns 124,programmable completion is
attempted again,allowing a user to dynamically build a set of completions
as completion is attempted by having the default completion function
install individual completion functions each time it is invoked.

bash的手册有一个例子:

_completion_loader()
{
     . "/etc/bash_completion.d/$1.sh" >/dev/null 2>&1 && return 124
}
complete -D -F _completion_loader
原文链接:https://www.f2er.com/bash/387161.html

猜你在找的Bash相关文章