LINUX.ORG.RU

keybindings в bash: привязывает не ко всем. Почему?

 ,


0

1

Всем привет!

Хочу сделать привязку к Ctrl+e. Делаю:

$ bind '"\C-e":"mc"'
Работает.

Теперь то же, но для Ctrl+q:

$ bind '"\C-q":"mc"'
Не работает.

К Ctrl+w - работает. Ctrl+s - не работает. Почему? Что за такие специфические комбинации?

Пробовал и в консоли, TERM=linux , и в GUI, TERM=xterm .

Как заставить работать?

★★★★★

Чайник трёхзвёздочный обыкновенный.

C-s и C-q это flow control, их нужно сначала отцепить через stty или вырубить средствами эмулятора терминала — как больше нравится.

anonymous
()

Может быть они уже назначены на что-то?

derlafff ★★★★★
()
Ответ на: комментарий от anonymous

их нужно сначала отцепить через stty или вырубить средствами эмулятора терминала — как больше нравится.

Как?

Kroz ★★★★★
() автор топика

Ctrl+S - остановить вывод на стандартное устройство.

Ctrl+Q - возобновить вывод на стандартное устройство.

Это специальные символы «канонического режима».

Если хочешь их переопределить, сначала отключи их спецфункции.

PS: Это же «азбука» терминального ввода/вывода.

DeVliegendeHollander ★★
()
Ответ на: комментарий от ziemin

А где их увидеть - список собственных комбинаций?
Если честно, то мне больше нужно Ctrl+\ - тоже не работает.

Kroz ★★★★★
() автор топика
Ответ на: комментарий от DeVliegendeHollander

Если хочешь их переопределить, сначала отключи их спецфункции.

Как?
P.S. Да, и на самом деле мне нужно Ctrl+\ - тоже не работает.

Kroz ★★★★★
() автор топика
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от Kroz

Ctrl+\ это убить текущий процесс. Генерит сигнал kill. К sh это не относится - сигнал высылает терминал.

ziemin ★★
()
Ответ на: комментарий от Kroz

man stty

Смотри флаг [-]ixany

Я сейчас плохо помню, как именно точно, давно этим не баловался.

А Ctrl+\ — это же терминальный сигнал QUIT (завершение процесса). Но его тоже, по-моему, можно отключить.

Вот только зачем всё это? Для терминалов и эмуляторов это стандартные комбинации.

DeVliegendeHollander ★★
()
Ответ на: комментарий от anonymous

Господи боже мой, ты не можешь в маны? Ладно, держи:

Ааа, так это команда (что-то сразу не понял).
Все заработало, спасибо!

Kroz ★★★★★
() автор топика
Ответ на: комментарий от Kroz

Либо пытай гугл, либо делай как я в подобных случаях:

$ cat
И пробуй разные комбинации. Которые не будут дават видимых символов (или как C-\ убивать процесс) использовать не стоит.

ziemin ★★
()
Ответ на: комментарий от DeVliegendeHollander

А Ctrl+\ — это же терминальный сигнал QUIT (завершение процесса). Но его тоже, по-моему, можно отключить.

Да, уже нашел как:

$ stty quit ""

Вот только зачем всё это? Для терминалов и эмуляторов это стандартные комбинации.

Если честно, никогда этой комбинацией не пользовался. А убивал процесс обычно Ctrl+C . Разве нет?

Kroz ★★★★★
() автор топика
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от Kroz

Опять по памяти (могу ошибаться):

Ctrl+\ -> SIGQUIT (попытка корректного завершения процесса)

Ctrl+C -> SIGKILL (безусловное немедленное завершение процесса)

Вроде бы так.

DeVliegendeHollander ★★
()
Ответ на: комментарий от Kroz

А убивал процесс обычно Ctrl+C

Они посылают разные сигналы. C-C - interrupt, а C-\ kill. Если честно не помню чем они отличаются, но второй круче. Кажется его нельзя перехватить.

ziemin ★★
()
Ответ на: комментарий от ziemin

Всё правильно написал.

Ctrl+C - перехватывается; пытается корректно завершить программу.

Ctrl+\ - не перехватывается; посылает SIGKILL.

Это я перепутал, виноват.

ТС, прими во внимание поправки.

DeVliegendeHollander ★★
()
Ответ на: комментарий от DeVliegendeHollander

ТС, прими во внимание поправки.

Да, спасибо.

Kroz ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Поправь. Как правильно?

Или это всё-таки SIGQUIT?

Я как раз на практике (на нескольких консольных программах) пытался проверить.

Ну, расскажи, расскажи, как оно там правильно? Я не утверждаю, что я прав, я сомневаюсь и ищу ответ.

DeVliegendeHollander ★★
()
Ответ на: комментарий от DeVliegendeHollander

Вспомнил! C-\ не только убивает процесс, но и ещё и дамп делает, так что по-любому круче. По крайней мере во фре так.

ziemin ★★
()
Ответ на: комментарий от ziemin

Вот что пишет Танненбаум (Современные операционные системы, 2-е изд.) по этому поводу:

«Часто возникает необходимость прервать выполнение отлаживаемой программы. Для этой цели могут использоваться символы INTR (DEL) и QUIT (Ctrl+\). В системе Unix клавиша Del посылает сигнал прерывания SIGINT всем процессам, запущенным с данного терминала. Реализация может быть непростой. Наиболее сложным является передача информации от драйвера в ту часть системы, которая занимается обработкой сигналов, поскольку она не ожидает получения подобной информации. Результат нажатия клавиш Ctrl+\ (код 0x1C) аналогичен нажатию клавиши Del, с той разницей, что процессам посылается сигнал SIGQUIT, вызывающий прекращение работы процесса с сохранением дампа памяти, если этот сигнал специально не перехватывается процессом. При нажатии любой из этих клавиш драйвер должен вывести эхо в виде перевода строки и возврата каретки, а также очистить свой буфер с накопленными введенными символами, чтобы позволить начать новый ввод. Часто вместо клавиши Del для символа INTR по умолчанию используется сочетание клавиш Ctrl+C (код 0x03), так как с появлением электронно-лучевых дисплеев многие программы стали использовать клавишу Del для удаления символа справа от курсора при редактировании.»

Но в линуксе, кажется, по Ctrl+\ дамп по умолчанию отключён? Из соображений безопасности. Или я опять ошибся?

DeVliegendeHollander ★★
()
Ответ на: комментарий от DeVliegendeHollander
$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=48 time=29.4 ms
64 bytes from 8.8.8.8: icmp_req=2 ttl=48 time=25.8 ms
2/2 packets, 0% loss, min/avg/ewma/max = 25.861/27.664/29.017/29.468 ms # <= C-\
64 bytes from 8.8.8.8: icmp_req=3 ttl=47 time=19.6 ms
64 bytes from 8.8.8.8: icmp_req=4 ttl=47 time=17.9 ms
^C # <=
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 17.948/23.242/29.468/4.646 ms

Похоже всё стало наоборот. Но, ЕМНИП во фре ничего не менялось.

ziemin ★★
()
Ответ на: комментарий от ziemin

Ну-у, не знаю. Пробовал на guile и bc — оба перехватывают Ctrl+C, продолжают работать и выдают как подсказку команду для выхода. По Ctrl+\ оба сразу же вываливаются в шелл, но дампов не создают.

DeVliegendeHollander ★★
()
Ответ на: комментарий от ziemin

Об этом я уже говорил: по умолчанию в линуксе дампы отключены и, по-моему, довольно давно уже.

Мне собственно дампы и не нужны, я реакцию на клавиши просто проверял.

DeVliegendeHollander ★★
()
Ответ на: комментарий от ziemin

А nano и ed, например, обе комбинации перехватывают и сами обрабатывают.

Так что Ctrl+\ вполне себе перехватывается и безусловно программу не завершает.

DeVliegendeHollander ★★
()
Ответ на: комментарий от ziemin

C-A-BackSpace тоже ведь не работает

Да, её тоже по умолчанию отключать стали.

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

А так-то в общем всё работает по-прежнему.

DeVliegendeHollander ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.