November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Monday, April 26th, 2010 10:01 pm

Предположим, в силу исключительной криворукости вы умудрились в терминале привязать букву “e” к команде erase. И теперь при нажатии этой буквы у вас старается символ перед курсором. Соответственно, набрать stty sane или stty erase не представляется возможным.

Что делать?? Шелл пусть для определённости будет bash.
Один из вариантов отгадки под катом.

stty $'san\x65'

Оригинал этой записи. Комментировать можно тут или там.

Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме

Monday, April 26th, 2010 09:03 pm (UTC)
echo sany|tr x-z d-f
Monday, April 26th, 2010 09:04 pm (UTC)
ну, то есть не echo, а stty. echo у меня из cut-n-paste из терминала
Monday, April 26th, 2010 09:04 pm (UTC)
ctrl-k ещё есть :)
Monday, April 26th, 2010 09:08 pm (UTC)
Воспользоваться мышкой.
Monday, April 26th, 2010 09:34 pm (UTC)
и что ей сделать?
Monday, April 26th, 2010 09:35 pm (UTC)
какой-такой ctrl-k?
Monday, April 26th, 2010 09:35 pm (UTC)
Да, мне тоже tr первым делом в голову пришел. Никакого баша не надобно, даже на соляре голой прокатит. ;-)
Monday, April 26th, 2010 09:37 pm (UTC)
не понял. sany надо засунуть в tr, а без echo это сделать затруднительно, а echo не набирается из-за "e".
Monday, April 26th, 2010 09:38 pm (UTC)
а как команда-то будет выглядеть целиком?
Monday, April 26th, 2010 09:41 pm (UTC)
printf %s 'stty sanv' | tr u-w d-f | sh

Upd: и без tr обойтись можно, ибо printf ;-)

Upd2: для удостоверения:
STANDARDS
     The printf command is expected to be compatible with the IEEE Std 1003.2
     (``POSIX.2'') specification.</pre.
Edited 2010-04-26 09:44 pm (UTC)
Monday, April 26th, 2010 09:48 pm (UTC)
$ printf %s 'stty sanv' | tr u-w d-f | sh
stty: standard input: Invalid argument

что-то не так..
Monday, April 26th, 2010 09:51 pm (UTC)
вот так работает:
`printf %s 'stty sanv' | tr u-w d-f`
Monday, April 26th, 2010 09:55 pm (UTC)
ну или сразу так:
`printf "stty san\x65"`
Monday, April 26th, 2010 09:56 pm (UTC)
Тогда, видимо, надо туда ещё </dev/tty воткнуть. Подобрать триаду букв, которая не используется (v уже не годится)
Monday, April 26th, 2010 09:57 pm (UTC)
Это не-POSIX поведение printf, фря так не умеет, например.
Monday, April 26th, 2010 09:58 pm (UTC)
да, точно, так самое переносимое, видимо, будет.
Monday, April 26th, 2010 10:01 pm (UTC)
Закрыть программу :)
Monday, April 26th, 2010 10:05 pm (UTC)
Да, отдельно доставляет то, что даже 'sh -e' не запустишь и set не наберёшь ;-P

Хорошая задачка.
Monday, April 26th, 2010 10:06 pm (UTC)
ну где-то так тогда:
printf %s 'stty sanh </dhv/tty' | tr g-i d-f | sh

а объяснение , почему в предыдущем варианте stty ругнулся - это отдельная задачка для сисамдинов :)
Monday, April 26th, 2010 10:08 pm (UTC)
а если это текстовый терминал в однопользовательском режиме?
или вообще железный терминал..
Monday, April 26th, 2010 10:10 pm (UTC)
сисамдин -- отличная очепятка!
Monday, April 26th, 2010 10:15 pm (UTC)
в условии задачи был bash, а не sh с внешним printf'ом :)
Tuesday, April 27th, 2010 02:35 am (UTC)
А если это железный дровосек?
Tuesday, April 27th, 2010 04:43 am (UTC)
да пожалуйста

ivlad@ivlad-mbp ~$ cat > rrr
sany
ivlad@ivlad-mbp ~$ cat rrr
sany
ivlad@ivlad-mbp ~$ cat rrr|tr x-z d-f
sane
ivlad@ivlad-mbp ~$
Tuesday, April 27th, 2010 09:09 am (UTC)
я немного не в курсе как именно там "на букву назначается действие", подєтому не знаю сработает ли такой вариант:
# ls /
/bin
/etc
...
/var

После чего тупо мышкой выделить букву "е" и мышкой же вставить где надо :)

Иначе -- да, можно извращаться с заменами букв, с кодами букв, с реализацией всех действий в скриптах, а скрипты писать вне "неудачного" терминала, можно писать скрипты в редакторе, который позволяет копирование символов (тот же vi) и для старта брать файлик, который уже содержит символ "е", и т.д.

Хотя я бы первым делом постарался изменить эту кривую настройку терминала, убрать её нафиг. Иначе мазохизм получается.
Tuesday, April 27th, 2010 09:11 am (UTC)
stty erase e

после этого букву как ни вставляй - хоть с клавиатуры, хоть из буфера обмена, хоть Alt-кодами набирай - она всё равно будет распознана терминалом как команда удаления символа.

вот, собственно, в том и вопрос: КАК эту настройку терминала убрать. обычный способ: stty sane, но он не работает..
Tuesday, April 27th, 2010 09:18 am (UTC)
эмм.
# ls / > ~/r
# vi ~/r
(жмём "r", правим строчку /etc на stty sane, остальное удаляем)
:qw!
# chmod u+x ~/r
# ~/r

покатит? А то у меня линукса под рукой нету. :)
Tuesday, April 27th, 2010 09:20 am (UTC)
да, работает. тут ничего линукс-специфичного нет, можно и во freebsd проверять :)
Tuesday, April 27th, 2010 09:26 am (UTC)
эммм, freebsd у меня нету и никогда не было. :)

Я просто не был на 100% уверен, что "stty sane" не аннулируется после выхода из скрипта (хотя это и обходится:
* правкой в vi ~/.bashrc
* запуском в том же ~/r шелла
* правкой алиасов баша -- назначением алиасу "sttysain" команды "stty sane"
и т.д.)
Tuesday, April 27th, 2010 09:30 am (UTC)
stty действует на терминал в целом, а не на текущую программу, в нём запущенную
Tuesday, April 27th, 2010 09:32 am (UTC)
ну да, ну да.
Это и составляло 99% моей уверенности. :) Но проверить всё же хотелось, благо недолго же.
Tuesday, April 27th, 2010 09:38 am (UTC)
а есть ещё смешной вариант:
набираем:
# mak
жмём TAB, получаем "make" возвращаем курсор под букву "е", жмём Ctrl+U, и дописываем "stty san"

выполняем команду и готово :)
Tuesday, April 27th, 2010 09:40 am (UTC)
вот это хороший вариант :)
Tuesday, April 27th, 2010 12:43 pm (UTC)
stty san^Ve
ы?
Tuesday, April 27th, 2010 12:47 pm (UTC)
да, ещё один хороший вариант
Tuesday, April 27th, 2010 12:51 pm (UTC)
я бы сказал, штатный.
Tuesday, April 27th, 2010 12:53 pm (UTC)
да, но про этот способ не все помнят. я вот, например, начисто забыл