Использование 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 ?

  • Выполнить функцию readline без привязки клавиш?
  • тайм-аут вызывает, когда цикл чтения заканчивается, когда `cat` отключен
  • Каков общий формат ключевого слова для привязок ключей в файле «inputrc»?
  • Как автоматически установить bash readline в режим vi при входе в систему?
  • Просмотр параметров пути при использовании readline?
  • Входы ввода-вывода GNU readline vi-insert отображаются, похоже, не действуют
  • Почему разные терминалы имеют разные значения для ключей в файле .inputrc?
  • Каков стандартный способ включения CTRL + стрелки (alt + B и alt + F) в консоли без GUI?
  • 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 - лучшая ОС в мире.