Differences between revisions 1 and 2
Revision 1 as of 2008-07-17 17:19:07
Size: 8823
Editor: eSyr
Comment:
Revision 2 as of 2008-07-21 22:24:38
Size: 16696
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
== Основы использования командной строки == Основы использования командной строки
Line 3: Line 3:
Оставлены две незатр. темы: собственно операторы и написание командных сценариев. Совсем не было про шелл в первой ипостаси, между тем грамотно настр. шелл хорошо помогет облегчить работу с ком. строкой. Здесь мы прекращаем разговор про shell как про интегратор, оставив незатронутыми две очень важные темы, которые напрямую
связанны с shell как языком программирования:
 * операторы, которые обеспечивают shell алгоритмическую полноту( циклы, условные операторы)
 * написание собственных командных сценариев.
##3:21:48
пока что не говорилось про shell в своей первой ипостаси- как удобный инструмент для работы с командной строкой. А между
тем грамотно настроенный shell хорошо помогает облегчить работу с командной строкой.
Line 5: Line 11:
Среди разл. удобств, которые предл. шелл, есть следующие:
 * Prompt. Её можно здавать самому, это хранится в перем. окр. PS1. Например, PS1='$ '. Такую подск. обычно исп. в качестве примера. При задании prompt можно исп. спецпосл, коих довльно много: \u --- имчя польз, \n --- хост, \W --- последняя часть pwd
Среди различных удобств, которые предлагает shell, есть следующие:
Line 8: Line 13:
Отделение выдачи и промпта: какое надо сделать PS1="[\[`tput smso`\]\u@\h \W\[`tput rmso`\]]\$ ". tput --- выводит упр. посл. для изм. режима вывода. Это свйства самого терминала, tput илшь интерфейс к св-ву, на самом деле все программы, которые работают с терминалом, польз. этими св-вами. Что собой явл. результат работы tput. Результатом являются символы, escape-последовательности, для того, чтобы заставить терминал работать как-то иначЕ, нужно вывести символы, спец. символы, например, ^[[38m, ^[[0m, которые, вместо того, чтобы выводиться, как-то упр. терминалом. Это пошло с тех времё1н, кгда были только алф-цифр. терминалом, который гоняет байты туд-сюда. Когда выясн., что нелох было бы , чтбы можно было разные вещи, стали думать, как можно сделать так, чтобы это устройство показать буквы спец цветом. И додумлись до того, что нек. символы непечатные, более того, при выдаче этого симв. на экран он переходит в режи, когда им управляют, и следующие неск. символов указывают комнды. Дело в тм, что было это в давних годах, и было много сотен рахных типов терминалов, казалось бы, что это должно вымереть, но существует с дюжину разных программ, которые изображают из себя терминал, и у них у всех разные упр. посл., поэтому это не стит запоминать наизусть, а лучше изучить локументацию по terminfo и пользоваться tput.
 * bold --- полужирный
 * smso --- set mode standout --- наиболее выраженный режим, у разных терминалов он разный.
Если echo $PS1, т там уже раскрашено будет, ибо бэктики. Самая удобная программа для просмора этого --- hexdump -C
 * Подсказка командной строки. Её можно задавать самому, она хранится в переменной окружения PS1. Начнем с простого:
 PS1='$ '. Такую подсказку обычно используют в качестве примера во многих книжках по Unix-системам. Теперь давайте
 сделаем её более разумной. При задании подсказки можно использовать спецпоследовательности, которые при выводе shell
 будут заменятся значимой информацией. Таких спецпоследовательностей на самом деле довольно много: \u --- имя пользователя,
 \n --- имя хоста, \W --- последняя часть текущего каталога.
Line 13: Line 19:
Зачем бэкслешквадратные скобки --- баш двольно глубенький, ему говришь "моя подсказка сстоит из...", он считает ширину промпта и остальне место --- строка ввода, но упр. посл. не сдвигают курсор, поэтому их надо брать в кв. стрки.  Рассмотрим способ отделить начало результата работы команды и подсказку: PS1="[\[`tput smso`\]\u@\h \W\[`tput
 rmso`\]]\$ ".
 Команда tput --- выводит на терминал некую управляющую последовательность которая изменяет режим вывода. Например
 изменение цвета букв,перестановка курсора в произвольное место и т.д. Это свойства самого терминала. Программа tput всего
 лишь программный интерфейс к этому свойству. На самом деле практически все программы, которые работают с терминалом, и
 работают не только с командной строкой, но и со всем экраном пользуются этими свойствами. Что собой являет результат
 работы программы tput?. Результатом являются символы. Эти символы называются escape-последовательностями или
 управляющими последовательностям, т.е. для того, чтобы заставить терминал показывать как-то по-другому на него опять
 таки нужно вывести символы, но это будут уже специальные символы, например, Esc[38m, Esc[0m, которые, вместо того,
 чтобы отображаться на экране , как-то управляют терминалом, например изменят цвет вывода. Это пошло с тех времён, когда
 графических дисплеев не было, а основным устройством управления системой был алфавитно-цифровой терминал, который через
 последовательное подключений соединялся с компьютером и гонял байты туда-сюда. Когда выяснилось, что было бы неплохо
 чтобы на этих терминалах можно было хотя бы печатать текст в определенном месте, уж не говоря о различных цветах, стали
 думать, как можно сделать так, чтобы это устройство, которое по сути аналогично печатной машинке, например показать буквы
 другим цветом. Было принято следующее решение - некоторые символы непечатные - при выдаче на экран ничего не
 происходит, более того, при выдаче этого символа на экран он переходит в режим, когда им управляют, и следующие несколько
 символов указывают команды. Такая последовательность управляющих символов получила название "управляющая
 последовательность". В период когда это все разрабатывалось было придумано несколько сотен разных типов терминалов с
 различными возможностями и управляющими последовательностями.После того как терминалы вышли из употребления эта ситуация
 вовсе не стала проще, однако до сих пор существует с дюжину разных программ, которые эмулируют терминал, и у них у всех
 по-прежнему разные управляющие последовательности. Именно поэтому не стоит запоминать наизусть конкретные управляющие
 последовательности, а лучше изучить документацию по подсистеме terminfo - база данных информации про терминал- и
 пользоваться командой tput.
<дописать>
* bold --- полужирный
* smso --- set mode standout --- наиболее выраженный режим, у разных терминалов он разный.

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

Последний вопрос, который мы рассмотрим - зачем команда tput была обрамлена \[ и \] --- bash рассматривает подсказку весьма
примитивно - он считает ширину подсказки суммируя ширину всех её составляющих, после чего считает что подсказка занимает
подсчитанное место, а все остальное место --- строка ввода. Но если встречаются управляющие последовательности, то их
длина точно также прибавляется к ширине подсказки, однако управляющие последовательности не сдвигают курсор, поэтому у
bash формируется неправильное представление о том, где встречается курсор. Специально для этого в PS1 и существуют \[ и \]
Line 17: Line 58:
Мы его по факту приняли, но на самом деле там ещё моног интересного. Мы обнаружили такую штуку, как упр. последовательности. Это с тчки зрения терм. как железяки. А нет ли особых свйст, почему он имеет такое название, "оконечное устройство"? С точки зрения ОС, терминал не прсто передача байт, терминал эти байты преобразовывает. Когда мы запускали cat и потом ндо был, чтобы она закончилсь, мы бы нажимали ^D. Если бы мы его не зарег. как терминал, то ввод бы продолжался. Аналогично ^C. Здесь мы как раз имеем дело с тем фактом, что при передаче данных т и к терминалу данные обраб, при чём в обе строны. ут есть два вида обраю:
 * ^D --- система закр. для текущей программы сист. ввод. Первый тип преобр. ввода --- нека манип. с системой.
 * Более кокретная манип. с системой --- при нажатии на комб. клавиш посылается сигнал. Прграмма, получ сигнал, должн его обр, иначе эт сделает система. Когда наж ^C, это обр. системой --- посылется SIGINT. Есть утилита stty, кторая как раз этим и управляет. Если вы умудрились сделать так, что вы оказались в необр. режиме, то вас может выручить след. посл. команд: stty sane ^J (^J --- ещё одно св-во того, что наз. бич. В юиксе --- в конце строки стоит конец строки. Допустим, он совпадает с переводом строки, а при выводе на экран это должно опр.)
До этого мы воспринимали терминал как нечто само-собой разумеющееся, но на самом деле там есть много возможностей о которых
обычно не знают. Мы уже обнаружили такие вещи, как управляющие последовательности терминала. Это с точки зрения
терминала как аппаратного устройства. А нет ли особых свойств у терминала как у ???, почему он имеет название terminal-
"конечное устройство"? С точки зрения ОС Linux, терминал это не просто аппаратное устройство, занимающееся передачей байт,
он обладает свойством эти байты при передаче преобразовывать. В частности,Когда мы запускали программу cat и потом надо
было окончить ввод, мы нажимали ^D. Если бы это устройство не было бы зарегистрировано в системе как терминал, то ввод
^D привел бы к тому что программе cat передался бы символ с ASCII кодом 4, и она бы продолжала бы работать. Аналогично с
символами ^C. Здесь мы как раз имеем дело с тем фактом, что при передаче данных посредством терминала эти данные
обрабатываются, при чём в обе стороны. В приведенных примерах использованы два вида обработки данных:

* ^D --- система закрывает для текущей запущенной программы стандартный ввод. Это очень удобно когда программа считывает
данные из файла, а скажем с клавиатуры и надо сообщить ей что данные кончились. Первый тип преобразования ввода ---
некие манипуляции с системой. Нажатие ^C приводит к тому что программе посылается сигнал ( короткое сообщение, состоящее
только из номера сигнала) который программа должна обработать сама, либо вызовется стандартный обработчик, который в
большинстве случаев приводит к завершению программы. Есть отдельная утилита которая и управляет соответствием между нажатиями
клавиш и системными манипуляциями- stty. Если вы вдруг перевели терминал в режим , в котором он не обрабатывает такого рода
последовательности. то например можно применить такую последовательность команд stty sane ^J. Почему именно ^J? - это еще
одно свойство т.н. обрабатываемого режима передачи данных в терминале- в свое время бич всех компьютеров и принтеров -
сколько символов в конце строки и какие они. В некоторых системах два - "перевод строки" и "возврат каретки". Некоторые
используют эти же два символа, но в обратном порядке. Аналогично и с принтерами. В Unix и вслед за ним в Linux поступили
просто - сказали что в конце строки стоит символ конца строки. Как вы его определите- такой и будет. Допустим он совпадает
с переводом строки. А когда вы выводите это на экран пусть терминал и разбирается. В режиме необрабатываемого ввода
никакого преобразования не происходит, поэтому и надо нажимать ^J поскольку он и есть символ "конец строки"
*
Line 23: Line 85:
Среди прочих вариантов работы есть целых три сивола работы --- erase, kill, werase (bs, ^u, ^w). Среди прочих вариантов преобразования ввода\вывода проходящих через терминал есть целых три символа редактирования ввода ---
erase(удаление символа), kill(удаление строки), werase(удаление слова) (bs, u, w). Т.е. если вы запустили скажем программу
cat то вы можете редактировать её ввод этими тремя символами.
Line 25: Line 89:
Возр. к шеллу, как к инт. ком. строки: разумеется, этих трёх команд недост., поэтому любой уваж. себя шелл имеет огрмное кол-во кманд редакт. ввда. Например, стрелочки вверх=вниз --- история, а втрелчки влево-вправо --- перемещ. по строке. Ctrl-R --- поиск по истории. На самом деле, таких функций --- десятки. И в шелле есть способ привязать клавиши к функции. Возвратимся к shell, как к удобному интерфейсу командной строки: разумеется, этих трёх команд недостаточно, поэтому любой
уважающий себя shell имеет огромное кол-во команд редактирования ввода. Например, стрелочки вверх\вниз производит просмотр
история, а стрелочки влево\вправо отвечают перемещениям курсора по строке. Ctrl-R --- поиск по истории. На самом деле,
таких функций --- десятки. Одна из важных возможностей - способ привязать конкретную клавиши\ последовательность к
конкретной функции - команда bind. Именно эта команда определяет для многих программ, привязку клавиш к тем функциям. Эти
привязки относятся не к bash как таковому, а к специальной библиотеке readline. Справа стоит название функции, которую
надо вызвать, слева - последовательность клавиш. \C- означает Ctrl, M- --- meta(эта клавиша присутствует не на всех
терминалах) (esc)
Line 27: Line 98:
(рассказ про less) Идея команды bind --- назначить какие функции редактирования командной строки по нажатию каких клавиш выполнять. Например
так делается хождение по словам с помощью PgUp/PgDn:
Line 29: Line 101:
Есть команда bind, которая пр. привязку многих программ, к тем функиям, которые есть, к клавишам. Эти привязки относятся не к шеллу как таковому, а к библиотеке readline. C- значет control, M- --- meta (esc)

В чём идея --- назначить какие команды какими клавишами выполнять. Как сделать хождение по словам по PgUp/PgDn:
 * bind '"^[[5~": backward-word'
 * bind '"^[[6~": forward-word'
* bind '"^[[5~": backward-word'
* bind '"^[[6~": forward-word'
Line 42: Line 111:
|| 0 || 1 || 1 || 1 || || 1 || ArtemSerebriyskiy, VladimirLysikov, VsevolodKrishchenko || || || || 10 || 1 || 1 || 1 || || 1 || ArtemSerebriyskiy, VladimirLysikov, VsevolodKrishchenko || || ||

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

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

  • операторы, которые обеспечивают shell алгоритмическую полноту( циклы, условные операторы)
  • написание собственных командных сценариев.

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

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

  • Подсказка командной строки. Её можно задавать самому, она хранится в переменной окружения PS1. Начнем с простого: PS1='$ '. Такую подсказку обычно используют в качестве примера во многих книжках по Unix-системам. Теперь давайте сделаем её более разумной. При задании подсказки можно использовать спецпоследовательности, которые при выводе shell будут заменятся значимой информацией. Таких спецпоследовательностей на самом деле довольно много: \u --- имя пользователя, \n --- имя хоста, \W --- последняя часть текущего каталога.

    Рассмотрим способ отделить начало результата работы команды и подсказку: PS1="[\[tput smso\]\u@\h \W\[`tput rmso`\]]\$ ". Команда tput --- выводит на терминал некую управляющую последовательность которая изменяет режим вывода. Например изменение цвета букв,перестановка курсора в произвольное место и т.д. Это свойства самого терминала. Программа tput всего лишь программный интерфейс к этому свойству. На самом деле практически все программы, которые работают с терминалом, и работают не только с командной строкой, но и со всем экраном пользуются этими свойствами. Что собой являет результат работы программы tput?. Результатом являются символы. Эти символы называются escape-последовательностями или управляющими последовательностям, т.е. для того, чтобы заставить терминал показывать как-то по-другому на него опять таки нужно вывести символы, но это будут уже специальные символы, например, Esc[38m, Esc[0m, которые, вместо того, чтобы отображаться на экране , как-то управляют терминалом, например изменят цвет вывода. Это пошло с тех времён, когда графических дисплеев не было, а основным устройством управления системой был алфавитно-цифровой терминал, который через последовательное подключений соединялся с компьютером и гонял байты туда-сюда. Когда выяснилось, что было бы неплохо чтобы на этих терминалах можно было хотя бы печатать текст в определенном месте, уж не говоря о различных цветах, стали думать, как можно сделать так, чтобы это устройство, которое по сути аналогично печатной машинке, например показать буквы другим цветом. Было принято следующее решение - некоторые символы непечатные - при выдаче на экран ничего не происходит, более того, при выдаче этого символа на экран он переходит в режим, когда им управляют, и следующие несколько символов указывают команды. Такая последовательность управляющих символов получила название "управляющая последовательность". В период когда это все разрабатывалось было придумано несколько сотен разных типов терминалов с различными возможностями и управляющими последовательностями.После того как терминалы вышли из употребления эта ситуация вовсе не стала проще, однако до сих пор существует с дюжину разных программ, которые эмулируют терминал, и у них у всех по-прежнему разные управляющие последовательности. Именно поэтому не стоит запоминать наизусть конкретные управляющие последовательности, а лучше изучить документацию по подсистеме terminfo - база данных информации про терминал- и пользоваться командой tput.

<дописать> * 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

PspoClasses/080717/05ConsoleBasics (last edited 2008-10-15 08:51:49 by eSyr)