Основы использования командной строки

Здесь мы прекращаем разговор про shell как про интегратор, оставив незатронутыми две очень важные темы, которые напрямую связанны с shell как языком программирования:

пока что не говорилось про shell в своей первой ипостаси- как удобный инструмент для работы с командной строкой. А между тем грамотно настроенный shell хорошо помогает облегчить работу с командной строкой.

Среди различных удобств, которые предлагает shell, есть следующие:

<дописать> * bold --- полужирный * smso --- set mode standout --- наиболее выраженный режим, у разных терминалов он разный.

Обратите внимание, что командой echo $PS1 нельзя узнать какие именно управляющие последовательности были задействованы, т.к. экран честно выполнит поступившие к нему команды. Самая удобная программа для просмотра --- hexdump с ключом -C

Последний вопрос, который мы рассмотрим - зачем команда tput была обрамлена \[ и \] --- bash рассматривает подсказку весьма примитивно - он считает ширину подсказки суммируя ширину всех её составляющих, после чего считает что подсказка занимает подсчитанное место, а все остальное место --- строка ввода. Но если встречаются управляющие последовательности, то их длина точно также прибавляется к ширине подсказки, однако управляющие последовательности не сдвигают курсор, поэтому у bash формируется неправильное представление о том, где встречается курсор. Специально для этого в PS1 и существуют \[ и \]

Понятие терминала

До этого мы воспринимали терминал как нечто само-собой разумеющееся, но на самом деле там есть много возможностей о которых обычно не знают. Мы уже обнаружили такие вещи, как управляющие последовательности терминала. Это с точки зрения терминала как аппаратного устройства. А нет ли особых свойств у терминала как у ???, почему он имеет название terminal- "конечное устройство"? С точки зрения ОС Linux, терминал это не просто аппаратное устройство, занимающееся передачей байт, он обладает свойством эти байты при передаче преобразовывать. В частности,Когда мы запускали программу cat и потом надо было окончить ввод, мы нажимали ^D. Если бы это устройство не было бы зарегистрировано в системе как терминал, то ввод ^D привел бы к тому что программе cat передался бы символ с ASCII кодом 4, и она бы продолжала бы работать. Аналогично с символами ^C. Здесь мы как раз имеем дело с тем фактом, что при передаче данных посредством терминала эти данные обрабатываются, при чём в обе стороны. В приведенных примерах использованы два вида обработки данных:

* ^D --- система закрывает для текущей запущенной программы стандартный ввод. Это очень удобно когда программа считывает данные из файла, а скажем с клавиатуры и надо сообщить ей что данные кончились. Первый тип преобразования ввода --- некие манипуляции с системой. Нажатие ^C приводит к тому что программе посылается сигнал ( короткое сообщение, состоящее только из номера сигнала) который программа должна обработать сама, либо вызовется стандартный обработчик, который в большинстве случаев приводит к завершению программы. Есть отдельная утилита которая и управляет соответствием между нажатиями клавиш и системными манипуляциями- stty. Если вы вдруг перевели терминал в режим , в котором он не обрабатывает такого рода последовательности. то например можно применить такую последовательность команд stty sane J. Почему именно J? - это еще одно свойство т.н. обрабатываемого режима передачи данных в терминале- в свое время бич всех компьютеров и принтеров - сколько символов в конце строки и какие они. В некоторых системах два - "перевод строки" и "возврат каретки". Некоторые используют эти же два символа, но в обратном порядке. Аналогично и с принтерами. В Unix и вслед за ним в Linux поступили просто - сказали что в конце строки стоит символ конца строки. Как вы его определите- такой и будет. Допустим он совпадает с переводом строки. А когда вы выводите это на экран пусть терминал и разбирается. В режиме необрабатываемого ввода никакого преобразования не происходит, поэтому и надо нажимать ^J поскольку он и есть символ "конец строки" *

Две вещи:

Среди прочих вариантов преобразования ввода\вывода проходящих через терминал есть целых три символа редактирования ввода --- erase(удаление символа), kill(удаление строки), werase(удаление слова) (bs, u, w). Т.е. если вы запустили скажем программу cat то вы можете редактировать её ввод этими тремя символами.

Возвратимся к shell, как к удобному интерфейсу командной строки: разумеется, этих трёх команд недостаточно, поэтому любой уважающий себя shell имеет огромное кол-во команд редактирования ввода. Например, стрелочки вверх\вниз производит просмотр история, а стрелочки влево\вправо отвечают перемещениям курсора по строке. Ctrl-R --- поиск по истории. На самом деле, таких функций --- десятки. Одна из важных возможностей - способ привязать конкретную клавиши\ последовательность к конкретной функции - команда bind. Именно эта команда определяет для многих программ, привязку клавиш к тем функциям. Эти привязки относятся не к bash как таковому, а к специальной библиотеке readline. Справа стоит название функции, которую надо вызвать, слева - последовательность клавиш. \C- означает Ctrl, M- --- meta(эта клавиша присутствует не на всех терминалах) (esc)

Идея команды bind --- назначить какие функции редактирования командной строки по нажатию каких клавиш выполнять. Например так делается хождение по словам с помощью PgUp/PgDn:

* bind '"^[[5~": backward-word' * bind '"^[[6~": forward-word'


Сведения о ресурсах

Готовность (%)

Продолжительность (ак. ч.)

Подготовка (календ. ч.)

Полный текст (раб. д.)

Предварительные знания

Level

Maintainer

Start date

End date

10

1

1

1

1

ArtemSerebriyskiy, VladimirLysikov, VsevolodKrishchenko


CategoryLectures CategoryPspo CategoryMpgu CategoryUneex