编写类似于scp的bash完成脚本

时间:2014-08-08 16:38:24

标签: bash shell bash-completion

我有一个脚本我以为我会通过Bash完成允许完成。

该脚本采用带引号的字符串参数,然后采用文件或服务器,例如

my_cmd "something"  stuff

我认为我可以通过以下方式利用与scp命令完成相同的完成:

have my_cmd &&
_my_cmd()
{
    . /usr/share/bash-completion/completions/scp >/dev/null 2>&1 && complete -F _scp $1 && return 124
} && complete -F _my_cmd my_cmd

哪个有效,但是这会在已知服务器上附加一个冒号。真的不太了解bash-completion如何让你有更好的想法来实现这个目标?

1 个答案:

答案 0 :(得分:3)

如果查看scp完成,它使用来自/ usr / share / bash-completion / bash-completion的_known_hosts_real:

# Helper function for completing _known_hosts.
# This function performs host completion based on ssh's config and known_hosts
# files, as well as hostnames reported by avahi-browse if
# COMP_KNOWN_HOSTS_WITH_AVAHI is set to a non-empty value.  Also hosts from
# HOSTFILE (compgen -A hostname) are added, unless
# COMP_KNOWN_HOSTS_WITH_HOSTFILE is set to an empty value.
# Usage: _known_hosts_real [OPTIONS] CWORD
# Options:  -a             Use aliases
#           -c             Use `:' suffix
#           -F configfile  Use `configfile' for configuration settings
#           -p PREFIX      Use PREFIX
# Return: Completions, starting with CWORD, are added to COMPREPLY[]

所以,你可能想要的是:

_my_cmd() {
    local cur prev words cword
    _init_completion || return
   _known_hosts_real -a "$cur"
} && complete -F _my_cmd my_cmd

至少这对我有用。我承认,我一般不写这些,但它似乎与其他完成的工作方式一致。这是另一个相关的例子,如果你想用你的完成再做一些shell foo:

https://unix.stackexchange.com/questions/136351/autocomplete-server-names-for-ssh-and-scp

编辑:

以下是主机和文件,主要受_scp_local_files所做的启发:

_my_cmd() {
    local cur prev words cword
    _init_completion || return

   _known_hosts_real -a "$cur"

    COMPREPLY+=( $( ls -aF1dL $cur* 2>/dev/null | \
        sed -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g' -e "s/^/$prefix/") )

} && complete -F _my_cmd my_cmd

同样,这只是从_scp完成并自己制作所需的内容。这对我有用,但目录名完成有点不稳定。