我有一个脚本我以为我会通过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如何让你有更好的想法来实现这个目标?
答案 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
完成并自己制作所需的内容。这对我有用,但目录名完成有点不稳定。