Как создать псевдоним или функцию, которая сохраняет завершение табуляции?

Используйте сопроцесс . Используя встроенный coproc , вы можете запустить подпроцесс, прочитать его вывод и проверить его статус выхода:

coproc LS { ls existingdir; }
LS_PID_=$LS_PID
while IFS= read i; do echo "$i"; done <&"$LS"
wait "$LS_PID_"; echo $?

Если каталог не существует, wait выйдет с ненулевым статусом код.

В настоящее время необходимо скопировать PID в другую переменную, потому что $ LS_PID будет сброшен до вызова wait . См. Bash сбрасывает переменную * _PID, прежде чем я смогу дождаться coproc , чтобы узнать подробности.

7
20.08.2015, 00:33
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
    ...
    
2
27.01.2020, 20:16

Я взломал это, чтобы завершение также работало для systemctl+args. Я скопировал некоторые части исходного кода дополнения bash -для systemctl, чтобы управлять этим (/usr/share/bash -завершением/завершением/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 _*_unit в исходном файле и скопируйте мои примеры.

Я также пытался изменить массив $COMP _WORDS, чтобы получить какое-то общее решение, работающее для всех команд, но безрезультатно.

0
23.12.2020, 20:32

Теги

Похожие вопросы