タブの完成を維持するエイリアスまたは関数を作成するにはどうすればよいですか?

タブの完成を維持するエイリアスまたは関数を作成するにはどうすればよいですか?

systemdを使用すると、いくつかのキーストロークを保存するためにエイリアスを作成しました。

$ alias sctl='systemctl'

ただし、これによりサブコマンドのタブの完成が中断されます。タブの完成を中断せずにコマンドにエイリアスを追加できますか?

答え1

systemctlまず、このコマンドがどの完全な機能を使用しているかを確認してください。

complete | grep " systemctl$"

出力は次のとおりです。

complete -F _functionname systemctl

次に、次を使用します。

complete -F _functionname sctl

エイリアスを完成する関数を登録します。

これで、入力したときとsctl <tab><tab>同じ提案が表示されます。systemctl

答え2

インストール後このツール、次のようにすることができます。

  • 存在する~/.bash_profile

    alias sctl='systemctl'
    
  • 存在する~/.bash_completion

    complete -F _complete_alias sctl
    
  • コマンドをsctl <tab>表示するには、次のように入力します。systemctl

    $ sctl <Tab>
    add-requires
    add-wants
    cancel
    cat
    condreload
    ...
    

答え3

systemctl+argsでも完了が機能するようにこれをハッキングしました。 systemctlが管理するbash-completionソースコードの一部をコピーしました(/usr/share/bash-completion/completions/systemctl)。

alias ssr='sudo systemctl restart'
alias sss='sudo systemctl status'
alias ssp='sudo systemctl stop'

# Load necessary functions in bash-completion's source code for systemctl (get_*_units)
source /usr/share/bash-completion/completions/systemctl
# Manually recreate some functions
_systemctl_status()
{
        comps=$( __get_non_template_units --system "${COMP_WORDS[1]}" )
        compopt -o filenames
        COMPREPLY=( $(compgen -o filenames -W '$comps') )
        return 0
}

_systemctl_restart()
{
        comps=$( __get_restartable_units --system "${COMP_WORDS[1]}" )
        compopt -o filenames
        COMPREPLY=( $(compgen -o filenames -W '$comps') )
        return 0
}

_systemctl_stop()
{
        comps=$( __get_stoppable_units --system "${COMP_WORDS[1]}" )
        compopt -o filenames
        COMPREPLY=( $(compgen -o filenames -W '$comps') )
        return 0
}

complete -F _systemctl_restart ssr
complete -F _systemctl_status sss
complete -F _systemctl_stop ssp

これは他のsystemctlコマンドに簡単に拡張できます。ソースファイルで正しい get_*_units コマンドを見つけて例をコピーします。

また、すべてのコマンドで動作する一般的な解決策を得るために$ COMP_WORDS配列を変更しようとしましたが、役に立ちませんでした。

関連情報