Bash и readline: как связать ключ с собственной молчаливой командой в bash?

То, что я хочу сделать, очень просто: добавить привязку клавиш к одной из моих программ с помощью файла запуска readline inputrc, но, кроме того, поскольку моя программа не производит никакого вывода, я не хочу, чтобы имя команды отображалось на стандартном выводе.

В чем моя проблема:

.inputrc содержимое:

"\e[1;5A":'pipe_send\n'

Когда я нажимаю ctrl+стрелка вверх, в командной строке появляется «pipe_send»:

[ alexkag@$$$$$:: / ]                                                  
$ pipe_send

Я бы хотел, чтобы pipe_send не появлялось в командной строке, как команды, предоставляемые readline, такие как поиск по истории-назад, поиск по истории-вперед и т. д. Знаете ли вы какой-нибудь способ сделать это? Может, мне не использовать readline? Примечание: моя привязка клавиш должна быть видна только в bash, а не во всей системе.


person Alexkag    schedule 31.05.2015    source источник
comment
Я мало что знаю о привязке клавиш, но, поскольку вы уже провели некоторое исследование, я считаю, что эта ссылка каким-то образом поможет вам. stackoverflow.com/questions/4200800/   -  person mainframer    schedule 31.05.2015
comment
Думаю, ты хочешь поместить это в свой .bashrc: bind -x '"\e[1;5A":pipe_send'.   -  person gniourf_gniourf    schedule 31.05.2015
comment
Я ничего не знаю о программировании readline, но такие ключевые слова, как history-search-forward в .inputrc, не заключаются в кавычки. Я так понимаю, это константы? Однако в вашем примере вы цитируете свою команду (pipe_send) как странную строку...   -  person cychoi    schedule 31.05.2015
comment
@cychoi: его команда не является ключевым словом. отсюда и цитаты.   -  person Karoly Horvath    schedule 31.05.2015
comment
@KarolyHorvath Хорошо, теперь я понял. Он не использует библиотеку readline для написания программы, которая реагирует на сочетания клавиш. Скорее, он использует bash для ответа на последовательность нажатия клавиш, а затем bash выводит строку на стандартный вывод (?), который, надеюсь, может быть передан его программе.   -  person cychoi    schedule 31.05.2015
comment
gniourf_gniourf и mainframer правы: у меня работает bind -x, спасибо, ребята.   -  person Alexkag    schedule 31.05.2015
comment
history-search-forward — это встроенная функция readline, а не буквальная строка.   -  person chepner    schedule 31.05.2015


Ответы (1)


Как упоминалось в комментариях gniourf_gniourf, решение:

bind -x '"\e[1;5A":pipe_send'

bind -x укажет bash выполнять команду при каждом нажатии определенной клавиши:

-x keyseq:shell-command

Вызывает выполнение команды оболочки всякий раз, когда вводится последовательность ключей. При выполнении команды оболочки оболочка устанавливает в переменной READLINE_LINE содержимое буфера строк Readline, а в переменной READLINE_POINT — текущее местоположение точки вставки. Если выполненная команда изменяет значение READLINE_LINE или READLINE_POINT, эти новые значения будут отражены в состоянии редактирования.

\e[1;5A — это код терминала, отправляемый для CtrlUp

person Community    schedule 03.03.2016