Как настроить завершение команды Bash?

Принятие eth1 и eth5, по крайней мере, установлено на ONBOOT=yes (хотя это не имеет никакой другой конфигурации), можно использовать POST_UP_SCRIPT переменная в ifcfg-eth5 назвать a sleep 5.

Или, наоборот, в ifcfg-bond0 набор PRE_UP_SCRIPT дать eth5 некоторое время для урегулирования.

Сравните с документацией SuSe.

24
23.01.2020, 12:05
4 ответа

Завершение команда (наряду с другими вещами) обрабатывается через bash завершение строки чтения . Это работает на несколько более низком уровне, чем обычное «программируемое завершение» (которое вызывается только тогда, когда команда идентифицирована, и в двух особых случаях, которые вы определили выше).

Обновление: новый выпуск bash-5.0 (январь 2019 г.) добавляет complete -I именно для этой проблемы.

Соответствующие команды readline:

 complete (TAB) 
Попытка выполнить завершение для текста перед точкой. Bash 
пытается завершить, рассматривая текст как переменную (если текст 
начинается с $), имя пользователя (если текст начинается с ~), имя хоста 
 (если текст начинается с @) или команду (включая псевдонимы и 
функции) по очереди.Если ни один из них не дает совпадения, выполняется попытка завершения имени файла 
. 
 
complete-command (M -!) 
Попытка завершения текста перед точкой, обрабатывая это как имя команды 
. Завершение команды пытается сопоставить текст 
с псевдонимами, зарезервированными словами, функциями оболочки, встроенными функциями оболочки 
и, наконец, именами исполняемых файлов в указанном порядке. 
 

Подобным образом. в более распространенный полный -F , часть этого может быть передана функции с помощью bind -x .

function _complete0 () {
    local -a _cmds
    local -A _seen
    local _path=$PATH _ii _xx _cc _cmd _short
    local _aa=( ${READLINE_LINE} )

    if [[ -f ~/.complete.d/"${_aa[0]}" && -x  ~/.complete.d/"${_aa[0]}" ]]; then
        ## user-provided hook
        _cmds=( $( ~/.complete.d/"${_aa[0]}" ) )
    elif [[ -x  ~/.complete.d/DEFAULT ]]; then
        _cmds=( $( ~/.complete.d/DEFAULT ) )
    else 
        ## compgen -c for default "command" complete 
        _cmds=( $(PATH=$_path compgen -o bashdefault -o default -c ${_aa[0]}) )  
    fi

    ## remove duplicates, cache shortest name
    _short="${_cmds[0]}"
    _cc=${#_cmds[*]} # NB removing indexes inside loop
    for (( _ii=0 ; _ii<$_cc ; _ii++ )); do
        _cmd=${_cmds[$_ii]}
        [[ -n "${_seen[$_cmd]}" ]] && unset _cmds[$_ii]
        _seen[$_cmd]+=1
        (( ${#_short} > ${#_cmd} )) && _short="$_cmd"
    done
    _cmds=( "${_cmds[@]}" )  ## recompute contiguous index

    ## find common prefix
    declare -a _prefix=()
    for (( _xx=0; _xx<${#_short}; _xx++ )); do
        _prev=${_cmds[0]}
        for (( _ii=0 ; _ii<${#_cmds[*]} ; _ii++ )); do
            _cmd=${_cmds[$_ii]}
             [[ "${_cmd:$_xx:1}" != "${_prev:$_xx:1}" ]] && break
            _prev=$_cmd
        done
        [[ $_ii -eq ${#_cmds[*]} ]] && _prefix[$_xx]="${_cmd:$_xx:1}"
    done
    printf -v _short "%s" "${_prefix[@]}"  # flatten 

    ## emulate completion list of matches
    if [[ ${#_cmds[*]} -gt 1 ]]; then
        for (( _ii=0 ; _ii<${#_cmds[*]} ; _ii++ )); do
            _cmd=${_cmds[$_ii]}
            [[ -n "${_seen[$_cmds]}" ]] && printf "%-12s " "$_cmd" 
        done | sort | fmt -w $((COLUMNS-8)) | column -tx
        # fill in shortest match (prefix)
        printf -v READLINE_LINE "%s" "$_short"
        READLINE_POINT=${#READLINE_LINE}  
    fi
    ## exactly one match
    if [[ ${#_cmds[*]} -eq 1 ]]; then
        _aa[0]="${_cmds[0]}"
        printf -v READLINE_LINE "%s " "${_aa[@]}"
        READLINE_POINT=${#READLINE_LINE}  
    else
        : # nop
    fi
}

bind -x '"\C-i":_complete0'

Это включает ваши собственные перехватчики для каждой команды или строки префикса в ~ / .complete.d / . Например. если вы создадите исполняемый файл ~ / .complete.d / loc с:

#!/bin/bash
echo localc

Это будет делать (примерно) то, что вы ожидаете.

Вышеупомянутая функция доходит до некоторой длины, чтобы имитировать нормальное поведение завершения команды bash, хотя это несовершенно (особенно сомнительный sort | fmt | столбец для отображения списка совпадений).

Однако , нетривиальная проблема с этим, он может использовать только функцию для замены привязки к основной функции complete (по умолчанию вызывается с помощью TAB).

Этот подход будет хорошо работать с другим связыванием клавиш, используемым только для пользовательского завершения команды, но он просто не реализует полную логику завершения после этого (например, более поздние слова в командной строке). Это потребует синтаксического анализа командной строки, работы с позицией курсора и других сложных вещей, которые, вероятно, не должны рассматриваться в сценарии оболочки ...

9
27.01.2020, 19:41

Не знаю, понял ли я, что вам это нужно ...
Это будет означать, что ваш bash знает только одну команду, начинающуюся с f .
Основная идея завершения: если это неоднозначно, выведите возможные варианты.
Таким образом, вы можете установить свой PATH в каталог, содержащий только эту одну команду, и отключить все встроенные функции bash, чтобы получить эту работу.

В любом случае, я могу предложить вам обходной путь:

alias _='true &&'
complete -W foo _

Итак, если вы наберете _ , он завершится до _ foo , который выполнит foo .

Тем не менее, псевдоним f = 'foo' был бы намного проще.

1
27.01.2020, 19:41

Проблема заключалась в том, что я не запускал /bin/bash --login до того, как установил Jekyll

-121--244804-

Большинство просто используют экспорт LC_ALL=C,make скрипта с ls, сортировкой и т.д. а затем вернуться к любимому LC, в моем случае UTF8.

-121--71772-

Выполните приведенную ниже команду, чтобы найти, где установлен двоичный файл mplayer:

which mplayer

ИЛИ используйте путь к двоичному файлу mplayer, если вы уже знаете об этом, в приведенной ниже команде:

ln -s /path/to/mplayer /bin/mplayer

В идеале все, что вы вводите, выполняется поиск во всех каталогах, указанных в переменной $ PATH .

-3
27.01.2020, 19:41

Простым ответом для вас будет

$ cd into /etc/bash_completion.d
$ ls

только основные выходы

autoconf       gpg2               ntpdate           shadow
automake       gzip               open-iscsi        smartctl
bash-builtins  iconv              openssl           sqlite3
bind-utils     iftop              perl              ssh
brctl          ifupdown           pkg-config        strace
bzip2          info               pm-utils          subscription-manager
chkconfig      ipmitool           postfix           tar
configure      iproute2           procps            tcpdump
coreutils      iptables           python            util-linux
cpio           lsof               quota-tools       wireless-tools
crontab        lvm                redefine_filedir  xmllint
cryptsetup     lzma               rfkill            xmlwf
dd             make               rpm               xz
dhclient       man                rsync             yum.bash
e2fsprogs      mdadm              scl.bash          yum-utils.bash
findutils      module-init-tools  service
getent         net-tools          sh

просто добавьте нужную программу для автоматического завершения bash

.
0
27.01.2020, 19:41

Теги

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