8823
Комментарий:
|
17749
|
Удаления помечены так. | Добавления помечены так. |
Строка 1: | Строка 1: |
== Основы использования командной строки == | Основы использования командной строки |
Строка 3: | Строка 3: |
Оставлены две незатр. темы: собственно операторы и написание командных сценариев. Совсем не было про шелл в первой ипостаси, между тем грамотно настр. шелл хорошо помогет облегчить работу с ком. строкой. | Здесь мы прекращаем разговор про shell как про интегратор, оставив незатронутыми две очень важные темы, которые напрямую связанны с shell как языком программирования: * операторы, которые обеспечивают shell алгоритмическую полноту( циклы, условные операторы) * написание собственных командных сценариев. ##3:21:48 Пока что не говорилось про shell в своей первой ипостаси- как удобный инструмент для работы с командной строкой. А между тем грамотно настроенный shell хорошо помогает облегчить работу с командной строкой. |
Строка 5: | Строка 10: |
Среди разл. удобств, которые предл. шелл, есть следующие: * Prompt. Её можно здавать самому, это хранится в перем. окр. PS1. Например, PS1='$ '. Такую подск. обычно исп. в качестве примера. При задании prompt можно исп. спецпосл, коих довльно много: \u --- имчя польз, \n --- хост, \W --- последняя часть pwd |
Среди различных удобств, которые предлагает shell, есть, например, подсказка командной строки. Её можно задавать самому, она хранится в переменной окружения PS1. Начнем с простого: {{{ PS1='$ ' }}} Такую подсказку обычно используют в качестве примера во многих книжках по Unix-системам. Теперь давайте сделаем её более разумной. При задании подсказки можно использовать спецпоследовательности, которые при выводе shell будут заменятся значимой информацией. Таких спецпоследовательностей на самом деле довольно много: ||\u || имя пользователя || ||\n || имя хоста до первой точки || ||\W || последняя часть текущего каталога|| ||\n || новая строка || Рассмотрим , например, один из способов отделить начало результата работы команды и подсказку: {{{ PS1="[\[`tput smso`\]\u@\h \W\[`tput rmso`\]]\$ " }}} Команда tput --- выводит на терминал некую управляющую последовательность которая изменяет режим вывода. Например изменение цвета букв,перестановка курсора в произвольное место и т.д. Это свойства самого терминала. Программа tput всего лишь программный интерфейс к этому свойству. На самом деле практически все программы, которые работают с терминалом, и работают не только с командной строкой, но и со всем экраном пользуются этими свойствами. Что собой являет результат работы программы tput?. Результатом являются символы. Эти символы называются escape-последовательностями или управляющими последовательностям, т.е. для того, чтобы заставить терминал показывать как-то по-другому на него опять таки нужно вывести символы, но это будут уже специальные символы, например, Esc[38m, Esc[0m, которые, вместо того, чтобы отображаться на экране , как-то управляют терминалом, например изменяют цвет вывода. Это пошло с тех времён, когда графических дисплеев не было, а основным устройством управления системой был алфавитно-цифровой терминал, который через последовательное подключение соединялся с компьютером и гонял байты туда-сюда. Когда выяснилось, что было бы неплохо чтобы на этих терминалах можно было хотя бы печатать текст в определенном месте, уж не говоря о различных цветах, стали думать, как можно сделать так, чтобы это устройство, которое по сути аналогично печатной машинке, могло,например, показать буквы другим цветом. Было принято следующее решение - некоторые символы непечатные - при выдаче на экран ничего не происходит, более того, при выдаче этого символа на экран он переходит в режим, когда им управляют, и следующие несколько символов указывают команды. Такая последовательность управляющих символов получила название "управляющая последовательность". В период когда это все разрабатывалось было придумано несколько сотен разных типов терминалов с различными возможностями и управляющими последовательностями. После того как алфавитно-цифровые терминалы вышли из употребления эта ситуация вовсе не стала проще, так как до сих пор существует с дюжину разных программ, которые эмулируют терминал, и у них у всех по-прежнему разные управляющие последовательности. Именно поэтому не стоит запоминать наизусть конкретные управляющие последовательности, а лучше изучить документацию по подсистеме terminfo - база данных информации про терминал- и пользоваться командой tput. Примеры || tput bold || полужирный || || tput smso || set mode standout --- наиболее выраженный режим, у разных терминалов он разный. || |
Строка 8: | Строка 26: |
Отделение выдачи и промпта: какое надо сделать 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 |
Обратите внимание, что командой echo $PS1 нельзя узнать какие именно управляющие последовательности были задействованы, т.к. экран честно выполнит поступившие к нему команды. Самая удобная программа для просмотра --- hexdump с ключом -C {{{ $echo $PS1 | hexdump -C 00000000 5b 5c 5b 1b 5b 37 6d 5c 5d 5c 75 40 5c 68 20 5c |[\[.[7m\]\u@\h \| 00000010 57 5c 5b 1b 5b 32 37 6d 5c 5d 5d 24 0a |W\[.[27m\]]$.| 0000001d }}} Последний вопрос, который мы рассмотрим - зачем команда tput была обрамлена \[ и \] --- bash рассматривает подсказку весьма примитивно - он считает ширину подсказки суммируя ширину всех её составляющих, после чего считает что подсказка занимает подсчитанное место, а все остальное место --- строка ввода. Но если встречаются управляющие последовательности, то их длина точно также прибавляется к ширине подсказки, однако управляющие последовательности не сдвигают курсор, поэтому у bash формируется неправильное представление о том, где встречается курсор. Специально для этого в PS1 и существуют \[ и \] |
Строка 13: | Строка 35: |
Зачем бэкслешквадратные скобки --- баш двольно глубенький, ему говришь "моя подсказка сстоит из...", он считает ширину промпта и остальне место --- строка ввода, но упр. посл. не сдвигают курсор, поэтому их надо брать в кв. стрки. | |
Строка 15: | Строка 36: |
Понятие терминала | === Понятие терминала === |
Строка 17: | Строка 38: |
Мы его по факту приняли, но на самом деле там ещё моног интересного. Мы обнаружили такую штуку, как упр. последовательности. Это с тчки зрения терм. как железяки. А нет ли особых свйст, почему он имеет такое название, "оконечное устройство"? С точки зрения ОС, терминал не прсто передача байт, терминал эти байты преобразовывает. Когда мы запускали cat и потом ндо был, чтобы она закончилсь, мы бы нажимали ^D. Если бы мы его не зарег. как терминал, то ввод бы продолжался. Аналогично ^C. Здесь мы как раз имеем дело с тем фактом, что при передаче данных т и к терминалу данные обраб, при чём в обе строны. ут есть два вида обраю: * ^D --- система закр. для текущей программы сист. ввод. Первый тип преобр. ввода --- нека манип. с системой. * Более кокретная манип. с системой --- при нажатии на комб. клавиш посылается сигнал. Прграмма, получ сигнал, должн его обр, иначе эт сделает система. Когда наж ^C, это обр. системой --- посылется SIGINT. Есть утилита stty, кторая как раз этим и управляет. Если вы умудрились сделать так, что вы оказались в необр. режиме, то вас может выручить след. посл. команд: stty sane ^J (^J --- ещё одно св-во того, что наз. бич. В юиксе --- в конце строки стоит конец строки. Допустим, он совпадает с переводом строки, а при выводе на экран это должно опр.) |
До этого мы воспринимали терминал как нечто само-собой разумеющееся, но на самом деле там есть много возможностей о которых обычно не знают. Мы уже обнаружили такие вещи, как управляющие последовательности терминала. Это с точки зрения терминала как аппаратного устройства. А нет ли особых свойств у терминала как у программной абстракции, почему он имеет название terminal- "конечное устройство"? С точки зрения ОС Linux, терминал это не просто аппаратное устройство, занимающееся передачей байт, он обладает свойством эти байты при передаче преобразовывать. В частности,Когда мы запускали программу cat и потом надо было окончить ввод, мы нажимали Ctrl-D. Если бы это устройство не было бы зарегистрировано в системе как терминал, то ввод Ctrl-D привел бы к тому что программе cat передался бы символ с ASCII кодом 4, и она бы продолжала бы работать. Аналогично с символами Ctrl-C. Здесь мы как раз имеем дело с тем фактом, что при передаче данных посредством терминала эти данные обрабатываются, при чём в обе стороны. В приведенных примерах использованы два вида обработки данных: |
Строка 21: | Строка 40: |
Две вещи: | * Ctrl-D --- система закрывает для текущей запущенной программы стандартный ввод. Это очень удобно когда программа считывает данные из файла, а скажем с клавиатуры и надо сообщить ей что данные кончились. Первый вид обработка данных -некие манипуляции с системой. Нажатие Ctrl-C приводит к тому что программе посылается сигнал ( короткое сообщение, состоящее только из номера сигнала) который программа должна обработать сама, либо вызовется стандартный обработчик, который в большинстве случаев приводит к завершению программы. Есть отдельная утилита которая и управляет соответствием между нажатиями клавиш и системными манипуляциями- stty. {{{ $ stty -a speed 38400 baud; rows 45; columns 143; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff -iuclc -ixany -imaxbel iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke }}} Если вы вдруг перевели терминал в режим , в котором он не обрабатывает такого рода последовательности. то например можно применить такую последовательность команд {{{ $ stty sane ^J }}} Почему именно Ctrl-J? - это еще одно свойство т.н. обрабатываемого режима передачи данных в терминале- в свое время бич всех компьютеров и принтеров - сколько символов в конце строки и какие они. В некоторых системах два - "перевод строки" и "возврат каретки". Некоторые используют эти же два символа, но в обратном порядке. Аналогично и с принтерами. В Unix и вслед за ним в Linux поступили просто - сказали что в конце строки стоит символ конца строки. Как вы его определите- такой и будет. Допустим он совпадает с переводом строки. А когда вы выводите это на экран пусть терминал и разбирается. В режиме необрабатываемого ввода никакого преобразования не происходит, поэтому и надо нажимать ^J поскольку он и есть символ "конец строки" * Среди прочих вариантов преобразования ввода\вывода проходящих через терминал есть целых три символа редактирования ввода --- erase(удаление символа), kill(удаление строки), werase(удаление слова) (bs, u, w). Т.е. если вы запустили скажем программу cat то вы можете редактировать её ввод этими тремя символами. |
Строка 23: | Строка 57: |
Среди прочих вариантов работы есть целых три сивола работы --- erase, kill, werase (bs, ^u, ^w). | Возвратимся к shell, как к удобному интерфейсу командной строки: разумеется, этих трёх команд недостаточно, поэтому любой уважающий себя shell имеет огромное кол-во команд редактирования ввода. Например, стрелочки вверх\вниз производит просмотр история, а стрелочки влево\вправо отвечают перемещениям курсора по строке. Ctrl-R --- поиск по истории. На самом деле, таких функций --- десятки. Одна из важных возможностей - способ привязать конкретную клавиши\ последовательность к конкретной функции. Это суть команды bind. Именно эта команда определяет для многих программ, привязку клавиш к тем функциям. Эти привязки относятся не к bash как таковому, а к специальной библиотеке readline. Формат таков --- Справа стоит название функции, которую надо вызвать, слева - последовательность клавиш. \C- означает Ctrl, \M- --- meta(эта клавиша присутствует не на всех кдавиатурах) |
Строка 25: | Строка 61: |
Возр. к шеллу, как к инт. ком. строки: разумеется, этих трёх команд недост., поэтому любой уваж. себя шелл имеет огрмное кол-во кманд редакт. ввда. Например, стрелочки вверх=вниз --- история, а втрелчки влево-вправо --- перемещ. по строке. Ctrl-R --- поиск по истории. На самом деле, таких функций --- десятки. И в шелле есть способ привязать клавиши к функции. (рассказ про less) Есть команда bind, которая пр. привязку многих программ, к тем функиям, которые есть, к клавишам. Эти привязки относятся не к шеллу как таковому, а к библиотеке readline. C- значет control, M- --- meta (esc) В чём идея --- назначить какие команды какими клавишами выполнять. Как сделать хождение по словам по PgUp/PgDn: |
Идея команды bind --- назначить какие функции редактирования командной строки по нажатию каких клавиш выполнять. Например так делается хождение по словам с помощью PgUp/PgDn: |
Строка 42: | Строка 72: |
|| 0 || 1 || 1 || 1 || || 1 || ArtemSerebriyskiy, VladimirLysikov, VsevolodKrishchenko || || || | || 20 || 1 || 1 || 1 || || 1 || ArtemSerebriyskiy, VladimirLysikov, VsevolodKrishchenko || || || |
Основы использования командной строки
Здесь мы прекращаем разговор про shell как про интегратор, оставив незатронутыми две очень важные темы, которые напрямую связанны с shell как языком программирования:
- операторы, которые обеспечивают shell алгоритмическую полноту( циклы, условные операторы)
- написание собственных командных сценариев.
Пока что не говорилось про shell в своей первой ипостаси- как удобный инструмент для работы с командной строкой. А между тем грамотно настроенный shell хорошо помогает облегчить работу с командной строкой.
Среди различных удобств, которые предлагает shell, есть, например, подсказка командной строки. Её можно задавать самому, она хранится в переменной окружения PS1. Начнем с простого:
PS1='$ '
Такую подсказку обычно используют в качестве примера во многих книжках по Unix-системам. Теперь давайте сделаем её более разумной. При задании подсказки можно использовать спецпоследовательности, которые при выводе shell будут заменятся значимой информацией. Таких спецпоследовательностей на самом деле довольно много:
\u |
имя пользователя |
\n |
имя хоста до первой точки |
\W |
последняя часть текущего каталога |
\n |
новая строка |
Рассмотрим , например, один из способов отделить начало результата работы команды и подсказку:
PS1="[\[`tput smso`\]\u@\h \W\[`tput rmso`\]]\$ "
Команда tput --- выводит на терминал некую управляющую последовательность которая изменяет режим вывода. Например изменение цвета букв,перестановка курсора в произвольное место и т.д. Это свойства самого терминала. Программа tput всего лишь программный интерфейс к этому свойству. На самом деле практически все программы, которые работают с терминалом, и работают не только с командной строкой, но и со всем экраном пользуются этими свойствами. Что собой являет результат работы программы tput?. Результатом являются символы. Эти символы называются escape-последовательностями или управляющими последовательностям, т.е. для того, чтобы заставить терминал показывать как-то по-другому на него опять таки нужно вывести символы, но это будут уже специальные символы, например, Esc[38m, Esc[0m, которые, вместо того, чтобы отображаться на экране , как-то управляют терминалом, например изменяют цвет вывода. Это пошло с тех времён, когда графических дисплеев не было, а основным устройством управления системой был алфавитно-цифровой терминал, который через последовательное подключение соединялся с компьютером и гонял байты туда-сюда. Когда выяснилось, что было бы неплохо чтобы на этих терминалах можно было хотя бы печатать текст в определенном месте, уж не говоря о различных цветах, стали думать, как можно сделать так, чтобы это устройство, которое по сути аналогично печатной машинке, могло,например, показать буквы другим цветом. Было принято следующее решение - некоторые символы непечатные - при выдаче на экран ничего не происходит, более того, при выдаче этого символа на экран он переходит в режим, когда им управляют, и следующие несколько символов указывают команды. Такая последовательность управляющих символов получила название "управляющая последовательность". В период когда это все разрабатывалось было придумано несколько сотен разных типов терминалов с различными возможностями и управляющими последовательностями. После того как алфавитно-цифровые терминалы вышли из употребления эта ситуация вовсе не стала проще, так как до сих пор существует с дюжину разных программ, которые эмулируют терминал, и у них у всех по-прежнему разные управляющие последовательности. Именно поэтому не стоит запоминать наизусть конкретные управляющие последовательности, а лучше изучить документацию по подсистеме terminfo - база данных информации про терминал- и пользоваться командой tput. Примеры
tput bold |
полужирный |
tput smso |
set mode standout --- наиболее выраженный режим, у разных терминалов он разный. |
Обратите внимание, что командой echo $PS1 нельзя узнать какие именно управляющие последовательности были задействованы, т.к. экран честно выполнит поступившие к нему команды. Самая удобная программа для просмотра --- hexdump с ключом -C
$echo $PS1 | hexdump -C 00000000 5b 5c 5b 1b 5b 37 6d 5c 5d 5c 75 40 5c 68 20 5c |[\[.[7m\]\u@\h \| 00000010 57 5c 5b 1b 5b 32 37 6d 5c 5d 5d 24 0a |W\[.[27m\]]$.| 0000001d
Последний вопрос, который мы рассмотрим - зачем команда tput была обрамлена \[ и \] --- bash рассматривает подсказку весьма примитивно - он считает ширину подсказки суммируя ширину всех её составляющих, после чего считает что подсказка занимает подсчитанное место, а все остальное место --- строка ввода. Но если встречаются управляющие последовательности, то их длина точно также прибавляется к ширине подсказки, однако управляющие последовательности не сдвигают курсор, поэтому у bash формируется неправильное представление о том, где встречается курсор. Специально для этого в PS1 и существуют \[ и \]
Понятие терминала
До этого мы воспринимали терминал как нечто само-собой разумеющееся, но на самом деле там есть много возможностей о которых обычно не знают. Мы уже обнаружили такие вещи, как управляющие последовательности терминала. Это с точки зрения терминала как аппаратного устройства. А нет ли особых свойств у терминала как у программной абстракции, почему он имеет название terminal- "конечное устройство"? С точки зрения ОС Linux, терминал это не просто аппаратное устройство, занимающееся передачей байт, он обладает свойством эти байты при передаче преобразовывать. В частности,Когда мы запускали программу cat и потом надо было окончить ввод, мы нажимали Ctrl-D. Если бы это устройство не было бы зарегистрировано в системе как терминал, то ввод Ctrl-D привел бы к тому что программе cat передался бы символ с ASCII кодом 4, и она бы продолжала бы работать. Аналогично с символами Ctrl-C. Здесь мы как раз имеем дело с тем фактом, что при передаче данных посредством терминала эти данные обрабатываются, при чём в обе стороны. В приведенных примерах использованы два вида обработки данных:
- Ctrl-D --- система закрывает для текущей запущенной программы стандартный ввод. Это очень удобно когда программа считывает данные из файла, а скажем с клавиатуры и надо сообщить ей что данные кончились. Первый вид обработка данных -некие манипуляции с системой. Нажатие Ctrl-C приводит к тому что программе посылается сигнал ( короткое сообщение, состоящее только из номера сигнала) который программа должна обработать сама, либо вызовется стандартный обработчик, который в большинстве случаев приводит к завершению программы. Есть отдельная утилита которая и управляет соответствием между нажатиями клавиш и системными манипуляциями- stty.
$ stty -a speed 38400 baud; rows 45; columns 143; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff -iuclc -ixany -imaxbel iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
Если вы вдруг перевели терминал в режим , в котором он не обрабатывает такого рода последовательности. то например можно применить такую последовательность команд$ stty sane ^J
Почему именно Ctrl-J? - это еще одно свойство т.н. обрабатываемого режима передачи данных в терминале- в свое время бич всех компьютеров и принтеров - сколько символов в конце строки и какие они. В некоторых системах два - "перевод строки" и "возврат каретки". Некоторые используют эти же два символа, но в обратном порядке. Аналогично и с принтерами. В Unix и вслед за ним в Linux поступили просто - сказали что в конце строки стоит символ конца строки. Как вы его определите- такой и будет. Допустим он совпадает с переводом строки. А когда вы выводите это на экран пусть терминал и разбирается. В режиме необрабатываемого ввода никакого преобразования не происходит, поэтому и надо нажимать ^J поскольку он и есть символ "конец строки" - Среди прочих вариантов преобразования ввода\вывода проходящих через терминал есть целых три символа редактирования ввода --- erase(удаление символа), kill(удаление строки), werase(удаление слова) (bs, u, w). Т.е. если вы запустили скажем программу cat то вы можете редактировать её ввод этими тремя символами.
Возвратимся к shell, как к удобному интерфейсу командной строки: разумеется, этих трёх команд недостаточно, поэтому любой уважающий себя shell имеет огромное кол-во команд редактирования ввода. Например, стрелочки вверх\вниз производит просмотр история, а стрелочки влево\вправо отвечают перемещениям курсора по строке. Ctrl-R --- поиск по истории. На самом деле, таких функций --- десятки. Одна из важных возможностей - способ привязать конкретную клавиши\ последовательность к конкретной функции. Это суть команды bind. Именно эта команда определяет для многих программ, привязку клавиш к тем функциям. Эти привязки относятся не к bash как таковому, а к специальной библиотеке readline. Формат таков --- Справа стоит название функции, которую надо вызвать, слева - последовательность клавиш. \C- означает Ctrl, \M- --- meta(эта клавиша присутствует не на всех кдавиатурах)
Идея команды bind --- назначить какие функции редактирования командной строки по нажатию каких клавиш выполнять. Например так делается хождение по словам с помощью PgUp/PgDn:
- bind '"^[[5~": backward-word'
- bind '"^[[6~": forward-word'
Сведения о ресурсах
Готовность (%) |
Продолжительность (ак. ч.) |
Подготовка (календ. ч.) |
Полный текст (раб. д.) |
Предварительные знания |
Level |
Maintainer |
Start date |
End date |
20 |
1 |
1 |
1 |
|
1 |
|
|