Использование bind для чтения текущей командной строки

Я использую bind -x для выполнения скрипта всякий раз, когда нажимается определенная последовательность клавиш.

Например, у меня есть сценарий в /usr/local/bin/foo с содержимым

 #!/bin/bash echo foo 

Если я запустил bind -x '" ": /usr/local/bin/foo' то каждый раз, когда я нажимаю пробел дважды, он эхо «foo». Все идет нормально.

То, что я хочу иметь, – это доступ (и, в идеале, изменение) текущей команды, которая вводится. Если я набираю some really long command (в конце есть два пробела), мой скрипт запускается, но как он может видеть, что я уже ввел some really long command и изменил ее на some other long command ?

  • Как автоматически установить bash readline в режим vi при входе в систему?
  • Полоса пропускания новой строки с входного канала
  • xinput - Ctrl + <Left> неправильно, если сопоставление истории-поиска-назад
  • отменить по умолчанию ключ от inputrc
  • Как искать историю bash в режиме vi для «foo. * Bar»
  • Редактирование строки (readline?) С помощью виртуальных клавиш
  • Как я могу использовать vi для редактирования строки подсказки утилиты?
  • Shell: Как получить последний аргумент предыдущей команды, когда она была отсоединена?
  • One Solution collect form web for “Использование bind для чтения текущей командной строки”

    Основываясь на этом ответе , я думаю, вам придется сделать ваш скрипт в исходную функцию bash, изменить его READLINE_LINE (и READLINE_POINT в соответствии с новой длиной / желаемой точкой курсора), а затем bind -x '" " : that-function-name' .

    Просто для уточнения; если вы хотите изменить некоторые команды с двойным пространством, сделайте что-то вроде:

     autocomplete() { if [ "$READLINE_LINE" = "some really long command" ] then READLINE_LINE="some other long command" READLINE_POINT=23 fi } bind -x '" " : autocomplete' 
    Linux и Unix - лучшая ОС в мире.