Bash 完整未按预期运行,捕获 COMPREPLY 中的第一个结果,然后将所有结果作为命令运行?

Bash 完整未按预期运行,捕获 COMPREPLY 中的第一个结果,然后将所有结果作为命令运行?

这有点棘手,让我先设置一下我在这里所做的事情,以便让您了解我想要完成的任务。

我正在读取一组 ssh 配置文件,以从这些文件中获取主机和主机名。我这样做是为了针对特定主机运行自定义脚本,为了实现这一目标,我想尝试编写一个支持主机的 bash 脚本。

我正在提取配置并使用 awk 解析主机和主机名,将它们列在字典中,然后使用该字典中的键来完成使用。

#!/bin/bash

NETWORKS_PATH=~/.ssh/Networks/
files=($(ls $NETWORKS_PATH))

declare -A a_dict

_read_network ()
{
    file=$1

    while read -r line; do    
        host=$(awk $line '$1 == "Host" { print $2 }')
    done < $file

    for hostiter in ${host[@]}; do
        hostname=$(ssh -n -tt -G $hostiter | awk '$1 == "hostname" { print $2 }') 

        a_dict[$hostiter]=$hostname
    done
}

_ff_completions()
{
    local hosts

    for file in ${files[@]}; do
        _read_network "$NETWORKS_PATH$file"
    done

    for key in "${!a_dict[@]}"; do
        hosts+="$key "
    done

    COMPREPLY=$(compgen -W "$hosts" -- "${COMP_WORDS[1]}")
}

complete -F _ff_completions ff

主机名和主机被正确捕获,我能够将它们作为完整的一部分输出,但完整似乎“注入”第一个列出的服务器作为其第一个建议并卡在上面?如果我尝试运行该命令,它会将所有建议作为命令传递。我有点困惑,我对此并不陌生,只是有点缺乏实践。

作为命令输出和运行的服务器名称。

相关内容