Bash Completeには現在の単語が含まれています。

Bash Completeには現在の単語が含まれています。

私のコマンドのbashコンプリートスクリプトを作成しようとしています。ls私が望む行動があります。私のコマンドでも同じ動作が必要です。

これは私が得たものです。ls

$ ls /home/tux/<Tab><Tab>
Downloads  Documents  Pictures
$ ls /home/tux/Do<Tab><Tab>
Downloads  Documents

つまり、bashは絶対パスではなく相対パスのみを表示します(つまり、Downloads完成リストに追加されますが、そうではありません/home/tux/Downloads)。

同じように動作する完成スクリプトを作成したいと思います。私が試したことは次のとおりです。

_testcommand ()
{
    local IFS=$'\n'
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -o bashdefault -d -- "$cur") )
    if [ "${#COMPREPLY[@]}" -ne 1 ]
    then
        # remove prefix "$cur", so the preview of paths gets shorter
        local cur_len=$(echo $cur | sed 's|/[^/]*$||' | wc -c)
        for i in ${!COMPREPLY[@]}
        do
            COMPREPLY[$i]="${COMPREPLY[i]:$cur_len}"
        done
    fi
    return 0
}

complete -o nospace -F _testcommand testcommand

ところで結果はこうです。

$ testcommand /home/tux/<Tab><Tab>
Downloads  Documents  Pictures
$ testcommand /home/tux/Do<Tab>
Downloads  Documents
$ testcommand Do

私の仕事をどのように終了できますか?いいえ/home/tux/コマンドラインから削除しますか?

complete注:下の呼び出しに「-f」や「-d」などを追加することはできないようです。実際、いくつかのケースでは、完成が道ではなく単語を完成する必要がある場合もあります。

ベストアンサー1

"ls":を使用して、どの完成機能が使用されているかを確認できますcomplete -p | grep ls。次のコマンドを使用してこの機能を確認できます。 (type _longopt前のコマンドの結果)関数で関数_longoptを見つけることができます_filedir

最後に仕上げに関する興味深い記事です。https://spin.atomicobject.com/2016/02/14/bash-programmable-completion/

おすすめ記事