Главная » Программирование для UNIX » Странное поведение терминала UNIX

0

Однажды терминал может начать вести  себя странно, например каждая  буква выводится дважды или  же  Return не перемещает курсор на начало следующей строки. Обычно  можно исправить положение, выключив и заново включив терминал или  же выйдя из системы и войдя снова. Можно  также прочесть описание команды stty (set  terminal options – задание установок терминала) в разделе 1 руководства (man1). Для правильной обработки знаков табуляции (если  сам  терминал их не обрабатывает) введите команду

$ stty -tabs

и система преобразует символ табуляции в соответствующее количество пробелов. Если терминал позволяет устанавливать шаг табуляции, то это можно сделать посредством команды tabs. (На самом деле может потребоваться ввести

$ tabs      тип5терминала

для  того, чтобы все заработало (обратитесь к описанию команды tabs  в руководстве.)

Ошибки ввода

Если  при вводе сделана ошибка и она обнаружена до нажатия Return, то  существуют  два  способа  исправления:  стереть символы  один  за другим или всю строку целиком, а потом набрать ее заново.1

Если  вводится символ стирания строки (line kill character) (по умол чанию символ @), то вся строка будет проигнорирована, как будто она никогда и не была  введена, и ввод будет продолжен с новой строки:

$ ddtae@                                Абсолютно неправильно, начинаем заново

date                                          с новой строки

Mon  Sep 26   12:23:39  EDT  1983

$

Символ # (знак диеза) стирает последний введенный символ; каждый новый # стирает еще один символ по направлению к началу строки (но не за ее пределами). Так  что ошибочный ввод можно исправить следу ющим образом:

$ dd#atte##e                           Исправляем прямо в процессе ввода

Mon  Sep 26   12:24:02  EDT  1983

$

На  какие  именно символы возложены  функции стирания  символа (забоя) и удаления строки, в большой степени зависит от системы. Во многих системах (включая ту,  с которой работают авторы) знак забоя  заменен на символ возврата на одну  позицию (backspace), что удобно для  видеотерминалов. Можно без труда проверить, как обстоят дела  в конкретной системе:

$ datee7                                                  Проверим 7

datee7:  not  found                                      Это не 7

$ datee#                                                       Попробуем # Mon  Sep 26   12:26:08  EDT  1983              Это #

$

(Символ возврата на одну  позицию изображен как 7 для большей наглядности). В качестве символа удаления строки также часто  используется ctl-u.

В данном разделе символ забоя  будет обозначаться как диез #, поскольку это отображаемый символ, но помните, что ваша система может отличаться. В  разделе  «Настройка окружения»  будет   показано,  как

1        Материал этого  раздела вряд ли имеет отношение к тем UNIX-системам, с которыми будет  иметь дело  читатель. Приведенная информация касается

«настоящих»  UNIX-систем с  «настоящими»  терминалами.  В  PC-шных версиях UNIX  все попроще и поудобнее. – Примеч. науч. ред.

можно раз и навсегда определить знаки забоя и удаления строки по усмотрению пользователя.

Что делать, если требуется ввести знак забоя  или удаления строки как часть текста? Если предварить символы # или @ обратной косой чертой \, они потеряют свое особое значение. Поэтому, чтобы ввести # или  @, наберите  \#  или  \@.  Система может переместить курсор на  следующую строку после  прочтения @, даже если перед  ним стояла обратная косая черта. Не беспокойтесь, «коммерческое at»  было записано.

Обратная косая черта, иногда называемая  escape5символом,  широко используется для указания того, что следующий за ней  символ имеет  специальное  значение.  Чтобы стереть  обратную  косую   черту, надо ввести два символа исключения: \##. Понятно почему?

Вводимые символы, прежде чем  они  доберутся до места  назначения, рассматриваются и интерпретируются целым рядом программ, а способ их интерпретации зависит не только от места  назначения, но и от того, каким образом они туда попали.

Каждый введенный символ незамедлительно отображается на терминале, если только эхо не выключено, что бывает достаточно редко. Пока не нажата клавиша Return, символы временно хранятся ядром, поэтому  опечатки можно поправить при помощи символов забоя  и аннулирования строки. Если  символ забоя  или удаления строки предварен обратной косой чертой, то ядро  отбрасывает черту  и сохраняет после дующий символ без интерпретации.

При  нажатии клавиши Return сохраненные  символы посылаются в программу, которая занимается чтением с терминала. Эта программа, в свою очередь, может интерпретировать символы специальным образом; например, оболочка (командный процессор) не воспринимает как имеющие особое  значение  символы, перед  которыми стоит  обратная косая черта. Об этом  будет  рассказано в главе 3. Пока же  запомните, что ядро  обрабатывает удаление строки, забой  и обратную косую  черту, только если  черта стоит  перед  знаком удаления строки или  забоя; оставшиеся же символы могут  быть  особым  образом интерпретированы другими программами.

Упражнение 1.1. Объясните, что произойдет с

$ date\@

~

Упражнение 1.2.  Большинство командных процессоров (в отличие от оболочки UNIX System 7)  интерпретируют знак  диеза #  как  начало комментария и игнорируют весь текст от # до конца строки. Учитывая это,  поясните запись, представленную ниже, считая, что # – это знак исключения:

$ date

Mon  Sep 26   12:39:56  EDT  1983

$ #date

Mon  Sep 26   12:40:21  EDT  1983

$ \#date

$ \\#date

#date: not  found

$

~

Источник: Керниган Б., Пайк Р., UNIX. Программное окружение. – Пер. с англ. – СПб: Символ-Плюс, 2003. – 416 с., ил.

По теме:

  • Комментарии