русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Командная строка как традиционная среда работы


Дата добавления: 2014-11-27; просмотров: 570; Нарушение авторских прав


 

Чтобы понять всю красоту организации системы Linux, достаточно получить доступ к так называемой оболочке командной строки (Shell). Как правило, при инсталляции Linux, в момент определения пользователя, предлагается определить для вновь созданного пользователя используемую им по умолчанию оболочку командной строки.

Shell – это интерфейс операционной системы (в данном случае – Linux, но понятие это свойственно любой Unix-системе), обеспечивающий интерпретацию команд, вводимых пользователем. В рамках терминологии DOS/Windows достаточно отдаленным аналогом данного инструмента является командный процессор command.com.

Кроме того, неотъемлемым атрибутом оболочки является интерпретатор собственного языка сценариев (называемых скриптами), собранных из единичных ее команд и логических конструкций по определенным правилам (то есть в соответствие с синтаксисом языка), подобно тому, как в DOS из ее внутренних и внешних команд собираются batch-файлы (однако и эта аналогия - достаточно далекая).

В отличие от DOS, где command.com единственен в своем роде, в Linux (и Unix вообще) оболочек существует достаточно много. В соотвтествии с синтаксисом используемого языка и поддерживаемыми дополнительными возможностями, они разделяются на две линии – линию Bourne Shell (оболочки Борна, в старых книгах по Unix называемой просто Shell) и линию C Shell (основанную на C-подобном языке).

В состав дистрибутивов Linux обычно входит несколько оболочек, представляющих обе линии, имеющих, как всегда, свои достоинства и недостатки. Однако по умолчанию используется так называемая оболочка bash (Bourne Again Shell – «еще одна оболочка Борна»), классификационная принадлежность которой ясна из названия, являющаяся бесплатной и открытой. Кроме того, в процессе установки, например, Slackware Linux, а также при загрузке с rescue-дискеты, используется оболочка ash - облегченный вариант bash, не требующий больших ресурсов.



Предполагается, что пользователь не имеет предшествующего опыта работы в Unix-подобных системах, никаких личных предпочтений у него по поводу оболочек не сложилось. А по умолчанию как раз и рекомендована оболочка bash.

Итак, после загрузки системы и авторизации в ней мы видим приглашение командной строки, имеющее по умолчанию вид

username@localhost username]$ – для обычного пользователя и

[root@localhost /root]# – для администратора (суперпользователя, супервизора, он же root).

Это и есть пользовательский интерфейс оболочки. После рассмотренных выше развитых графических сред он может показаться аскетичным, архаичным и даже примитивным.

Но если с первыми определениями еще можно согласиться, то последнее заведомо неверно. Оболочка предоставляет множество возможностей, иногда недостижимых другими средствами или достигаемыми много менее эффективными средствами.

Оболочка «умеет», во-первых, понимать и исполнять команды, вводимые пользователем с клавиатуры. Конечно, если эти команды существуют в природе (то есть системе Linux) и оболочка знает, где они расположены. Для этого она должна быть должным образом настроена, что обычно происходит при установке системы.

Общесистемные команды, то есть исполнимые файлы, всегда имеют строго определенное место в структуре каталогов Linux. И пути (path) к ним внесены в конфигурационный файл оболочки в виде переменной окружения PATH, подобно тому, как в DOS пути к исполнимым файлам вносятся в файл autoexec.bat. Посмотреть эти пути можно с помощью команды

echo $PATH .

Ответом на нее будет срока, аналогичная следующей:

/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin .

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

Этот файл (.bash_profile) находится по адресу $HOME (это - сокращенное обозначение домашнего каталога пользователя, эквивалентное /home/имя_пользователя). Следует обратить внимание на точку перед именем файла: она означает, что файл этот - скрытый, то есть может быть не виден при обычном режиме просмотра в каком-либо файловом менеджере.

Сделав его видимым и вызвав с помощью любого текстового редактора, нужно внести в строку

PATH=$PATH

соответствующие значения (например, $HOME/bin), разделяя их двоеточиями без пробелов. Кроме того, для удобства бывшего пользователя DOS в конец строки можно добавить точку:

PATH=$PATH:$HOME/bin:.

 

Это будет указывать оболочке на необходимость поиска команды в текущем каталоге; в отличие от DOS, Linux (вернее, большинство оболочек) по умолчанию и не думает просматривать его на предмет исполнимых файлов. Что поначалу несколько обескураживает. К слову сказать, точка (.) в указании пути в командной строке всегда символизирует текущий каталог, тогда как ../ - каталог родительский, а / - корневой.

Большинство базовых программ Linux коротки и представляют собой прозрачные сокращения английских слов, означающих соответствующие действия. Например: cp (от copy) - копирование файлов, ls (от list) - просмотр содержимого каталога, cd (от change directory) - смена каталога, mkdir (от make directory) - создание нового каталога, и т.д.

Но это отнюдь не обязательно: команды могут быть и весьма длинными и трудно запоминаемыми. В этом случае на помощь приходит могучее свойство оболочки, именуемое дополнением команд (напомню, что речь идет о bash; в других оболочках это свойство может и не поддерживаться, например, в той же ash).

Как им пользоваться? Пользователь набирает в командной строке несколько (сколько помнит заведомо) первых знаков команды и нажимает клавишу табулятора. Если повезло, и это сочетание уникально для требуемой команды - она будет продолжена в командной строке. Иначе раздастся звуковой сигнал, и после второго нажатия табулятора будет предложено на выбор несколько вариантов, из которых можно выбрать подходящий.

Чем-то это напоминает поиск по шаблону, но не нужно даже напрягаться указанием масок типа (таких как * или ?).

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

Команды в Linux, как и в DOS, могут иметь (и, как правило, имеют) параметры (или опции) и аргументы. Например, в команде

cp -R $HOME /mnt/floppy

два аргумента $HOME и /mnt/floppy указывают, что домашний каталог пользователя $HOME должен быть скопирован на дискету /mnt/floppy (которая тоже не более чем элемент дерева каталогов), а опция -R предписывает сделать это рекурсивно (то есть со всеми содержащимися файлами и вложенными подкаталогами). Опции и аргументы обязательно разделяются пробелами.

 

Забегая вперед, нельзя не отметить, что именно рекурсия, применимая к очень многим командам оболочки, обуславливает мощь последней, давая возможность наиболее простым способом выполнить действия, которые в ином случае потребовали многократных перемещений по дереву каталогов. Например, с помощью рекурсии можно одной командой изменить права доступа ко всем файлам домашнего каталога на любую глубину вложенности.

Оборотной стороной мощи команд оболочки является изобилие возможных параметров, запомнить которые нелегко, да и не всегда нужно, если помнить, что с помощью опции -h или --help после имени команды в большинстве случаев можно получить полный их список. Обратите внимание, что перед сокращенным указанием опции стоит одиночный дефис, а перед полным, синонимичным первому - сдвоенный: это - общее правило, как и положено, имеющее подтверждающие его исключения. В некоторых командах (например, программа архивации tar) дефис перед опцией не ставится вообще. А в ряде команд краткую справку по ее использованию можно получить при запуске без опций и аргументов.

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

Видимо, авторам оболочки bash так и показалось. И потому они ввели в нее еще одно свойство - историю команд. То есть, если при пустом приглашении командной строки нажать клавишу Up, в ней возникнет последняя из введенных команд. Повторное нажатие вызовет появление предпоследней команды, и т.д. А нажимая клавишу Down, можно пролистать всю историю ввода в обратном порядке. И выбрав нужную команду (в нашем примере cp -R $HOME /mnt/floppy), просто нажать Enter для ее исполнения. Причем история команд не исчезает при перезагрузке и, хотя глубина ее не безгранична, но вполне достаточна, составляя многие сотни.

Есть и другой способ, на выбор (ведь возможность выбора - это основа философии Linux): просто ввести в командной строке команду hystory - и перед пользователем возникнет нумерованный по возрастанию список введенных ранее команд. Чтобы выполнить нужную - необходимо просто ввести !# (где # - номер команды в списке) и нажать Enter.

Возможно, что список команд будет столь длинен, что его начало уйдет за пределы видимости. В Linux, в отличие от DOS, это не доставит никаких сложностей: нажимая клавишу PageUp при нажатой - Shift, пользователь может пролистывать экраны назад (нажимая PageDown - соответсвенно, вперед). Правда, глубина пролистывания ограничена 1000 строк.

Есть и третий способ: нужная команда из списка выделяестя мышью (обычным способом, как и в Windows, при нажатой левой клавише мыши) и вставляется в командную строку щелчком средней клавиши - команда исполнится тут же, не нужно даже утруждаться поисками клавиши Enter. Правда, этот способ обусловлен не особенностями оболочки, а определяется одним из стартовых сервисов - gpm.

И, наконец, четвертый способ - нажатие клавиатурной комбинации ^R (Ctrl R) вызовет поисковый интерфейс истории комманд, где, набирая првые символы необходимой конструкции, можно получить искомую команду со всеми использовавшимися аргументами, если она сохранена в истории комманд. Комбинация ^R предоставляет еще одну возможность непосредственно в процессе поиска - когда в истории комманд присутсвует несколько одинаковых макетов командной строки, различающихся одни-двумя аргументами, между ними можно переключаться именно этой клавиатурной комбинацией.

Коснемся еще одного кита, на котором зиждется могущество командной строки. Это - возможность перенаправления ввода/вывода. Что это такое и зачем нужно?

В Linux существует понятие стандартного ввода и стандартного вывода. По умолчанию в качестве первого обычно выступают данные, вводимые с клавиатуры, второго – результаты их обработки какой-либо программой, выводимые на экран монитора. В большинстве случаев как вводимые данные, так и выводимые результаты могут быть перенаправлены. Вводимые данные могут быть получены, например, не с клавиатуры, а из некоего файла, а выводимые результаты направлены не на экран, а в другой файл (существующий или новый).

Простейший пример: пользователю требуется создать простой текстовый файл в 1-2 строки. Для этого можно вызвать текстовый редактор, набрать в нем эти строки сохранить под каким-либо именем, а затем выйти из редактора. Правда, процедура до ввода строк и после при этом займет сопоставимое, если не большее время, чем собственно время полезной работы.

Это можно сделать так: в командной строке набрать команду cat (от слова concatenation, смысл чего станет ясен через несколько строк) следующим образом:

cat > file_1,

где > - символ перенаправления,

нажать Enter, ввести

Line 1,

снова нажать Enter, ввести

Line 2,

опять-таки нажать Enter, а затем - Control+d (в Linux - обозначение конца файла, подобно Control+Z в DOS). После чего новый файл создан. Чтобы убедиться в этом, можно снова прибегнуть к команде cat:

cat file1,

которая должна вывести на экран следующее:

Line 1

Line 2.

 

Файл этот может быть дополнен:

cat >> file1,

где >> указывает, что вновь вводимые данные должны быть добавлены к уже существующему файлу, после чего нужно ввести

Линия 3

Линия 4

и еще раз нажать Control+d. Теперь в ответ на команду

cat file1

на экран будет выведено:

Line 1

Line 2

Линия 3

Линия 4.

 

Не правда ли, просто? А еще с помощью все той же команды cat и операции перенаправления можно объединить (отсюда и название команды) любое количество сколь угодно длинных текстовых файлов (например, собрать книгу из отдельных глав):

cat file1 file2 > file3.

 

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

Операции перенаправления можно объединять в конструкции. В ниже приведенном примере сначала просматривается содержимое каталога test с помощью команды ls, перенаправляя ее вывод в файл:

[alv@localhost test]$ ls > list1

и, просматривая его содежимое командой cat, можно видеть:

 

[alv@localhost test]$ cat < list1

file1

file2

file3

list1,

 

поскольку без параметров команда ls сортирует список файлов в порядке возрастания.

Затем с помощью команды sort с соответствующим параметром -r (от reverse, то есть в обратном порядке) мы пересортируем этот список, получив данные из файла list1 и перенаправив их в файл list2.

 

[alv@localhost test]$ sort -r < list1 > list2

 

После чего в ответ на команду cat получаем:

 

[alv@localhost test]$ cat < list2

list1

file3

file2

file1

 

То есть перенаправление ввода/вывода - могучее орудие для производства простых (а также и очень сложных) операций. Однако это еще не все: перенаправление может быть осуществлено и с вывода одной программы на ввод другой. Для этого используется т.н. канал. Простейший пример - распечатка текстового файла или их серии:

cat file1 file2 file3 | lpr,

где | - символ канала (называемого также конвейером), а lpr - программа печати, получающая на вводе содержимое последовательности указанных файлов.

 

Каналы также не могут объединяться в конструкции как с друг с другом, так и с операциями перенаправления. Например, конструкция

ls > list | lpr

 

создает файл, немедленно направляемый на печать, а конструкция

ls | sort -r | lpr

 

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

 

Разумеется, приведенные примеры совершенно элементарны и могут показаться искусственными. Хотя пример с объединением глав книги и их печатью реален: приведенные конструкции позволяют выполнить эту операцию максимально быстро и просто.

Разумеется, многозадачность, как исконное свойство Linux, никуда не делась и при использовании командной строки, она может быть реализована разными способами. Например, запуском программы в фоновом режиме, что осуществляется вводом знака & после команды с ее опциями и аргументами (через пробел). Например:

sort -r list1 > list2 &

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

Однако фоновое выполнение команд не дает психологического ощущения настоящей многозадачности. Ибо в консольном режиме Linux большинство операций осуществляется настолько быстро, что их параллельное выполнение пользователь просто не успевает заметить.

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

Обычно же требуется совершенно другой аспект многозадачности: например, одновременное открытие двух (и более) текстовых документов и обмен фрагментами между ними. Для этого тоже существует эффективный метод (хотя он обеспечивается не средствами оболочки, а самой системой): виртуальные консоли, текстовый аналог многооконных графических сред.

Разумеется, использование терминала не ограничивается целями обмена данных. При необходимости обращения к программам текстового режима обычно проще вызвать терминал, чем переходить в виртуальную текстовую консоль. Кроме того, терминал позволяет запускать любые программы графического режима. Иногда, при использовании всякого рода параметров, это просто необходимость.

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

Далее перейдем к углубленному изучению командной строки.

 

 




<== предыдущая лекция | следующая лекция ==>
Window Maker | Начальные сведения о командах Linux


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.282 сек.