Командный язык ос unix shell. Shell как язык программирования и интегратор. Операторы while и until

Программное обеспечение с открытым исходным кодом (Open source) - способ разработки ПО, при котором создаваемый исходный код программ открыт, то есть, общедоступен для просмотра и изменения. Это позволяет всем желающим использовать уже созданный код для своих нужд и, возможно, помочь в разработке открытой программы.

«Открытая» лицензия не требует, чтобы ПО всегда предоставлялось бесплатно. Но многие из наиболее успешных проектов «открытого» ПО, тем не менее, бесплатны.

Подавляющее большинство открытых программ является одновременно свободными (GNU GPL) и наоборот, ибо определения открытого и свободного ПО близки, а большинство лицензий соответствуют обоим.

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

ОС Microsoft Windows

Рис. 39. Логотип OC Windows.

MS Windows (произносится Ви́ндоуз) - семейство операционных систем компании Microsoft (Майкрософт). Глава корпорации MicrosoftБилл Гейтс .

Начиная с 1995 года Windows - самая популярная операционная система на рынке персональных компьютеров – стандарт де-факто. К 2005-му году Microsoft Windows была установлена более чем на 89% персональных компьютеров.

Однако многие пользователи сделали выбор в пользу ОС Windows так как совсем не знакомы с альтернативами, такими как MacOS, Linux, BSD. В России до начала 2000-х годов почти все персональные компьютеры продавались с предустановленной операционной системой Windows. Борьба с распространением пиратских версий программных продуктов привела к появлению интереса к другим операционным системам. Так, например, стало возможным приобрести персональный компьютер с предустановленной бесплатной ОС Linux .

Хронология выпусков версий Windows


1. Windows 1.0 (1985)

2. Windows 2.0 (1987)

3. Windows/386 (1987)

4. Windows 3.0 (1990)

5. Windows 3.1 (1992)

6. Windows NT 3.1 (1993)

7. Windows NT 3.5 (1994)

8. Windows 95 (1995)

9. Windows NT 4.0 (1996)

10. Windows 98 (1998)

11. Windows 2000 (2000)

12. Windows Me (2000)

13. Windows XP (2001)

14. Windows 2003 (2003)

15. Windows Vista (2007)

16. Windows рабочее название Vienna (2010)


Интегрированные программные продукты и прикладное ПО

Операционная система Microsoft Windows включает в себя стандартные приложения, такие как браузер Internet Explorer , почтовый клиент Outlook Express , проигрыватель Windows Media Player .

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

Рис. 40. Логотип пакета MS Office.

Для MS Windows существует очень удобный и освоенный большинством пользователей пакет прикладных программ Microsoft Office , включающий:

Текстовый процессор MS Word ,

Табличный процессор MS Excel ,

Органайзер MS Outlook ,

Приложение для подготовки презентаций MS PowerPoint ,

Приложение для управления базами данных MS Access .

Не стоит забывать, что и ОС Windows и абсолютное большинство популярных прикладных программ под Windows имеют лицензию copyright, т.е. являются проприетарным ПО. Соответственно каждая копия такой программы должна приобретаться за деньги. Например, на конец 2006 года цена на Windows XP Home Edition Russian BOX (SP2) - $185, Office 2003 Russian CD – $322.

Используя нелицензионное (пиратское) ПО, защищенное лицензией copyright, вы нарушаете законодательство о защите авторских прав.

ОС GNU/Linux

Рис. 41. Логотип ОС GNU/Linux – пингвиненок Tux.

Операционная система GNU/Linux (произносится «гну ли́нукс») - свободная UNIX-подобная операционная система. Обычно, по историческим причинам и для краткости, эта система называется просто «Linux». Это самая мощная альтернатива MS Windows, популярная в качестве серверной и резко набирающая популярность в качестве настольной (desktop) операционной системы в последние годы, в связи с усилением контроля за соблюдением лицензионного использования ОС Windows со стороны Microsoft в версиях XP и Vista.

К операционной системе GNU/Linux также часто относят программы, дополняющие эту операционную систему, и прикладные программы, делающие её полноценной многофункциональной операционной средой.

В отличие от большинства других операционных систем, GNU/Linux не имеет единой «официальной» комплектации. Вместо этого GNU/Linux поставляется в большом количестве так называемых дистрибутивов , в которых программы GNU соединяются с ядром Linux и другими программами. Самые распространённые в мире дистрибутивы:

Американский Red Hat и его наследник Fedora Core ;

Немецкий SuSE ;

Французский Mandriva (бывший Mandrake );

Не имеющий национальной принадлежности международный дистрибутив Debian GNU/Linux ;

Один из самых старых дистрибутивов Slackware ;

Сравнительно молодой и активно развивающийся дистрибутив Gentoo ;

Молодой, но перспективный дистрибутив Ubuntu Linux .

Создатель ядра Linux - Линус Торвальдс . GNU/Linux не имеет географического центра разработки. Нет и организации, которая владела бы этой системой; нет даже единого координационного центра. Программы для GNU/Linux - результат работы тысяч проектов. Некоторые из этих проектов централизованы, некоторые сосредоточены в фирмах, но большинство объединяют программистов со всего света, которые знакомы только по переписке. Создать свой проект или присоединиться к уже существующему может любой и, в случае успеха, результаты работы станут известны миллионам пользователей. Пользователи принимают участие в тестировании свободных программ, общаются с разработчиками напрямую, что позволяет быстро находить и исправлять ошибки и реализовывать новые возможности.

На рынке серверных операционных систем Австралии Linux уже заняла около 30%. За австралийцами последовали и бразильцы. Бразильское правительство решило отказаться от расходования средств на программное обеспечение и перейти с продуктов Microsoft на системы с открытым кодом, в частности, ОС Linux. Главная причина изменений – экономическая. В нашей стране рынок Linux пока невелик.

Файловая система

Вся информация в компьютере хранится в файлах, с которыми и работает операционная система.

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

Файлы организованы в каталоги, также называемые директориями (directory) или папками (folder). Каталог - это файл, который хранит сведения о других файлах: имя, размер, дату создания, адрес файла на диске.

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

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

Файлы и каталоги являются самыми важными объектами файловой системы. Файловая система - регламент, определяющий способ организации, хранения и именования данных на носителях. Она определяет формат физического хранения файлов. Конкретная файловая система определяет размер имени файла, максимально возможный размер файла, набор атрибутов файла.

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

Все файлы условно можно разделить на две части - текстовые и двоичные .

Текстовые файлы - наиболее распространенный тип данных в компьютерном мире. Для хранения каждого символа чаще всего отводится один байт, а кодирование текстовых файлов выполняют с помощью специальных кодировочных таблиц.

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

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

Каждый файл на диске имеет обозначение (полное имя ), которое состоит из 2 частей: имени и расширения , разделенных точкой.

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

В ранних операционных системах длина расширения была ограничена тремя символами, в современных операционных системах это ограничение отсутствует.

Операционная система или менеджер файлов могут устанавливать соответствия между расширениями файлов и приложениями.

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

Драйверы

C ПК могут сопрягаться разнообразные устройства: видеокарта, звуковая карта, принтер, сканер, манипуляторы, дисководы, цифровые фотоаппараты, сотовые телефоны… Каждое из них имеет свой набор команд – свой «язык». Чтобы конкретная операционная система могла управлять конкретным устройством, прибегают к помощи программ–«переводчиков», знающих с одной стороны язык команд конкретного устройства, а с другой – язык конкретной операционной системы, под управлением которой должно работать это устройство.

Такая программа называется драйвером (driver) и поставляется вместе с устройством его производителем. Производители аппаратного ПО, как правило, также размещают драверы, созднных ими устройств, на своих web-сайтах.

Помимо Android мы с вами наверняка знаем о существовании iOS и Windows Phone. Еще где-то далеко существует BlackBerry OS, и в прошлом осталась Symbian. Это то, что на слуху, однако есть несколько операционных систем, которые известны гораздо меньше, но при этом достойны внимания. Как и Android, они построены на ядре Linux и имеют открытый исходный код. Однако это не помогло им добиться таких же успехов.

Ubuntu Phone

Canonical разработала под действием желания стандартизировать все вокруг. Подобно Windows, который автоматически подстраивается под ваш компьютер после установки, Ubuntu готова подстроиться под любые устройства, будь то смартфон, планшет, телевизор или компьютер. В зависимости от типа устройства ОС сама подстроится под размер экрана и тип ввода данных.

Пользователи Ubuntu Phone могут просто подключить смартфон к компьютеру и использовать на экране компьютера настольную версию Ubuntu. В этом идеология немного совпадает с Microsoft, которая хочет стереть грани между мобильной и настольной ОС, а также приложениями для них.

HP webOS

Изначально webOS принадлежала компании Palm, но HP купила Palm в 2010 году. У HP были большие планы на webOS, планировалось выпустить смартфон, планшет, принтер и даже компьютер под управлением этой ОС. Был запущен планшет HP TouchPad, но он не смог конкурировать с iPad, и идея не пошла дальше.


Позднее компания LG использовала возможности webOS в своем умном телевизоре, и это оказалось неплохой идеей. webOS, несмотря на свою непопулярность, обладает некоторыми интересными особенностями, которые еще можно продать.

Samsung Tizen

Tizen построен на ядре Linux, а интерфейс этой ОС полностью копирует TouchWiz от Samsung. Другими словами, в этой системе нет ничего незнакомого и в то же время . Сегодня на этой ОС работают некоторые умные часы компании Samsung, однако больших планов компания на нее не имеет. У них проблема с привлечением разработчиков, а без приложений Tizen никому не нужна.

Jolla Sailfish

У этой ОС длинная и интересная история. Как-то в Nokia работали над Maemo-устройствами, построенными на Linux. Позднее Maemo стала частью платформы MeeGo OS, которая принадлежала Intel. Единственным смартфоном, выпущенным на MeeGo, стал Nokia N9, и он пользовался популярностью среди разработчиков. Однако перед сделкой с Microsoft проект MeeGo был закрыт, и компания сконцентрировалась на Windows Phone.

Большая часть команды, работавшей над MeeGo, ушла из компании и открыла собственную, под названием Jolla. Все права на MeeGo остались у Nokia, и они были вынуждены создать собственную на основе исходных кодов MeeGo. Эта ОС может работать как с Qt-приложениями, так и с приложениями для Android.

Amazon Fire

В планшетах Amazon Kindle используется то, что Amazon называет Fire OS. На самом деле это Android, версия AOSP, над которой серьезно поработали в Amazon. Узнать в Fire OS Android просто невозможно. При этом она работает с Android-приложениями, вот только загружать их надо не из Google Play. Amazon не использует сервисы Google, продавая контент через собственный магазин, и он достаточно крупный.

Firefox OS

Mozilla давно пытается создать свое решение для смартфонов. То, что они имеют , построено на Gecko и браузере Firefox. Все приложения для Firefox OS поддерживают современные веб-технологии, такие как HTML 5. В Mozilla считают, что эпоха нативных приложений уйдет, и будущее за веб-приложениями. Так же считал Стив Джобс, запуская iPhone.

Nokia X

Над этой платформой трудятся в Microsoft. Она представляет из себя смесь Android и Windows Phone, но построена она все же на Android. Смартфоны на этой платформе не встретили большой любви пользователей из-за отсутствия сервисов от Google, но продаются, из-за невысокой стоимости.

По материалам EFYTimes

  • Tutorial

Зачем и для кого статья?

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

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

Статья касается полноценных unix-подобных окружений, с полнофункциональным шеллом (предпочтительно zsh или bash)и достаточно широким набором стандартных программ.

Что такое шелл

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

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

Типичный вид шелла:

Шелл - это основной способ для взаимодействия со всеми Unix-подобными серверными системами.

Где встречаются системы с командной строкой?

Где вас может поджидать unix-овый шелл, популярные варианты:
  • MacOS (bash);
  • удаленный доступ на сервер по работе или для личного веб-проекта;
  • домашний файл-сервер с удаленным доступом;
  • Ubuntu, PC-BSD на ноутбуке/десктопе - unix-подобные системы сегодня просты в установке и использовании.

Какие задачи разумно решать шеллом?

Естественные задачи, для которых шелл пригоден, полезен и незаменим:
  • интерактивная работа в терминале:
    • выполнение компиляции, запуск заданий через make;
    • сравнение текстовых файлов;
    • быстрый ad-hoc анализ данных (количество уникальных ip в логе, распределение записей по часам/минутам и т.п.);
    • разовые массовые действия (прибить много процессов; если работаете с системой контроля версий - ревертнуть или зарезолвить кучу файлов);
    • диагностика происходящего в системе (семафоры, локи, процессы, дескрипторы, место на диске и т.п.);
  • скриптование:
    • установочные скрипты, для выполнения которых нельзя рассчитывать на наличие других интерпретаторов - это не для новичков;
    • функции для кастомизации интерактивного шелла (влияющие на приглашение, меняющие каталог, устанавливающие переменные окружения) - тоже не совсем для новичков;
    • одноразовые скрипты типа массового перекодирования файлов;
    • makefile-ы.

Абсолютно первые шаги

Начинаем работу: войти и выйти

Убедитесь, что точно знаете, как запустить шелл и как из него выйти.

Если вы работаете за машиной, на которой установлена Ubuntu, вам надо запустить программу Terminal. По окончании работы можно просто закрыть окно.

На MacOS - тоже запустить Terminal.

Для доступа к удаленному серверу - воспользоваться ssh (если локально у вас MacOS, Ubuntu или другая unix-like система) или putty (если у вас Windows).

Кто я, где я?

Выполните следующие команды:
  • hostname - выводит имя машины (сервера), на которой вы сейчас находитесь;
  • whoami - выводит ваш логин (ваше имя в системе);
  • tree -d / |less - псевдографическое изображение дерева каталогов на машине; выход из пролистывания - q ;
  • pwd - выводит каталог, в котором вы сейчас находитесь; в командной строке вы не можете быть «просто так», вы обязательно находитесь в каком-то каталоге (=текущий каталог, рабочий каталог). Вероятно, текущий рабочий каталог выводится у вас в приглашении (prompt).
  • ls - список файлов в текущем каталоге; ls /home - список файлов в указанном каталоге;

История команд (history)

Важное свойство полноценной командной строки - история команд.

Выполните несколько команд: hostname , ls , pwd , whoami . Теперь нажмите клавишу «вверх». В строке ввода появилась предыдущая команда. Клавишами «вверх» и «вниз» можно перемещаться вперед и назад по истории. Когда долистаете до hostname , нажмите Enter - команда выполнится еще раз.

Команды из истории можно не просто выполнять повторно, а еще и редактировать. Долистайте историю до команды ls , добавьте к ней ключ -l (получилось ls -l , перед минусом пробел есть, а после - нет). Нажмите Enter - выполнится модифицированная команда.

Пролистывание истории, редактирование и повторное выполнение команд - самые типичные действия при работе в командной строке, привыкайте.

Copy-paste

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

Прекрасной особенностью текста является то, что его можно копировать и вставлять, это верно и для командной строки.

Попробуйте выполнить команду date +"%y-%m-%d, %A"
Вводили ли вы ее целиком руками или скопировали из статьи? Убедитесь, что вы можете ее скопировать, вставить в терминал и выполнить.

После того, как научитесь пользоваться man "ом, убедитесь, что можете скопировать и выполнить примеры команд из справки. Для проверки найдите в справке по программе date раздел EXAMPLES , скопируйте и выполните первый приведенный пример (на всякий случай: знак доллара не является частью команды, это условное изображение приглашения к вводу).

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

Ключи и опции

При исследовании истории команд вы уже столкнулись с тем, что у команды ls есть по крайней мере два варианта. Если вызвать ее просто так, она выводит простой список:

Akira@latitude-e7240: ~/shell-survival-quide> ls Makefile shell-first-steps.md shell-first-steps.pdf shell-survival-quide.md shell-survival-quide.pdf
Если же добавить ключ -l , к каждому файлу выводится подробная информация:

Akira@latitude-e7240: ~/shell-survival-quide> ls -l total 332 -rw-rw-r-- 1 akira akira 198 Feb 13 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 Feb 14 22:26 shell-first-steps.md -rw-rw-r-- 1 akira akira 146226 Feb 13 11:49 shell-first-steps.pdf -rw-rw-r-- 1 akira akira 16626 Feb 13 11:45 shell-survival-quide.md -rw-rw-r-- 1 akira akira 146203 Feb 13 11:35 shell-survival-quide.pdf
Это очень типичная ситуация: если к вызову команды добавлять специальные модификаторы (ключи, опции, параметры), поведение команды меняется. Сравните: tree / и tree -d / , hostname и hostname -f .

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

Ls -ld /home ls -l /home grep root /etc/passwd

man

man - справка по командам и программам, доступным на вашей машине, а также по системным вызовам и стандартной библиотеке C.

Попробуйте: man grep , man atoi , man chdir , man man .

Пролистывание вперед и назад делается кнопками «вверх», «вниз», «PageUp», «PageDown», выход из просмотра справки - кнопкой q . Поиск определенного текста в справочной статье: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям - клавиша n .

Все справочные статьи делятся на категории. Самые важные:

  • 1 - исполняемые программы и шелльные команды (wc , ls , pwd и т.п.);
  • 2 - системные вызовы (fork , dup2 и т.п.)
  • 3 - библиотечные функции (printf , scanf , cos , exec).
Указывать, из какой именно категории надо показать справку, нужно в случаях совпадений имен. Например, man 3 printf описывает функцию из стандартной библиотеки C, а man 1 printf - консольную программу с таким же именем.

Посмотреть список всех доступных на машине справочных статей можно с помощью команды man -k . (точка - тоже часть комады).

less

Когда в небольшом окне терминала надо просмотреть очень длинный текст (содержимое какого-то файла, длинный man и т.п.), используют специальные программы-«пейджеры» (от слова page/страница, то есть постраничные листатели). Самый популярный листатель - less , и именно он обеспечивает вам пролистывание, когда вы читаете man-ы.

Попробуйте и сравните поведение:

Cat /etc/bash.bashrc cat /etc/bash.bashrc |less

Можно передать файл в пролистыватель сразу в параметрах:

Less /etc/bash.bashrc

Пролистывание вверхи и вниз - кнопки «вверх», «вниз», «PageUp», «PageDown», выход - кнопка q . Поиск определенного текста: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям - клавиша n . (Узнаете инструкцию про man ? Ничего удивительного, для вывода справки тоже используется less .)

Права

С любым файлом или каталогом связан набор «прав»: право на чтение файла, право на запись в файл, право исполнять файл. Все пользователи делятся на три категории: владелец файла, группа владельца файла, все прочие пользователи.

Посмотреть права на файл можно с помощью ls -l . Например:

> ls -l Makefile -rw-r--r-- 1 akira students 198 Feb 13 11:48 Makefile
Этот вывод означает, что владельцу (akira) можно читать и писать файл, группе (students) - только читать, всем прочим пользователя - тоже только читать.

Если при работе вы получаете сообщение permission denied , это значит, что у вас недостаточно правна объект, с которым вы хотели работать.

Подробнее читайте в man chmod .

STDIN, STDOUT, конвейеры (пайпы)

С каждой исполняющейся программой связаны 3 стандартных потока данных: поток входных данных STDIN , поток выходных данных STDOUT , поток для вывода ошибок STDERR .

Запустите программу wc , введите текст Good day today , нажмите Enter, введтие текст good day , нажмите Enter, нажмите Ctrl+d. Программа wc покажет статистику по количеству букв, слов и строк в вашем тексте и завершится:

> wc good day today good day 2 5 24
В данном случае вы подали в STDIN программы двухстрочный текст, а в STDOUT получили три числа.

Теперь запустите команду head -n3 /etc/passwd , должно получиться примерно так:

> head -n3 /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin
В этом случае программа head ничего не читала из STDIN , а в STDOUT написала три строки.

Можно представить себе так: программа - это труба, в которую втекает STDIN , а вытекает STDOUT .

Важнейшее свойство юниксовой командной строки состоит в том, что программы-«трубы» можно соединять между собой: выход (STDOUT) одной программы передавать в качестве входных данных (STDIN) другой программе.

Такая конструкция из соединенных программ называется по-английски pipe (труба), по-русски - конвейер или пайп.

Объединение программ в конвейер делается символом | (вертикальная черта)

Выполните команду head -n3 /etc/passwd |wc , получится примерно следующее:

> head -n3 /etc/passwd |wc 3 3 117
Произошло вот что: программа head выдала в STDOUT три строки текста, которые сразу же попали на вход программе wc , которая в свою очередь подсчитала количество символов, слов и строк в полученном тексте.

В конвейер можно объединять сколько угодно программ. Например, можно добавить к предыдущему конвейеру еще одну программу wc , которая подсчитает, сколько слов и букв было в выводе первой wc:

> head -n3 /etc/passwd |wc |wc 1 3 24

Составление конвейеров (пайпов) - очень частое дело при работе в командной строке. Пример того, как это делается на практике, читайте в разделе «Составление конвейера-однострочника».

Перенаправление ввода-вывода

Вывод (STDOUT) програмы можно не только передать другой программе по конвейеру, но и просто записать в файл. Такое перенаправление делается с помощью > (знак «больше»):

Date > /tmp/today.txt
В результате выполнения этой команды на диске появится файл /tmp/today.txt . Посмотрите его содержимое с помощью cat /tmp/today.txt

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

Если надо не перезаписать файл, а добавить вывод в его конец, используйте >> :

Date >> /tmp/today.txt
Проверьте, что теперь записано в файле.

Кроме того, программе можно вместо STDIN передать любой файл. Попробуйте:

Wc

Что делать, когда что-то непонятно

Если вы сталкиваетесь с поведением системы, которое не понимаете, или хотите добиться определенного результата, но не знаете, как именно, советую действовать в следующем порядке (кстати, это относится не только к шеллам):
  • насколько возможно четко сформулируйте вопрос или задачу - нет ничего сложнее, чем решать «то, не знаю что»;
  • вспомните, сталкивались ли вы уже с такой же или подобной проблемой - в этом случае стоит попробовать решение, которое сработало в прошлый раз;
  • почитайте подходящие man-ы (если понимаете, какие man-ы подходят в вашем случае) - возможно, вы найдете подходящие примеры использования команд, нужные опции или ссылки на другие команды;
  • подумайте: нельзя ли немного поменять задачу? - возможно, чуть-чуть изменив условия, вы получите задачу, которую уже умеете решать;
  • задайте свой четко сформулированный вопрос в поисковой системе - возможно, ответ найдется на Stack Overflow или других сайтах;
Если ничего из перечисленного не помогло - обратитесь за советом к преподавателю, опытному коллеге или товарищу. И не бойтесь задавать «глупые» вопросы - не стыдно не знать, стыдно не спрашивать.

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

Методы работы

Скопировать-и-вставить - из man-ов, из статей на StackOverflow и т.п.Командная строка состоит из текста, пользуйтесь этим: копируйте и используйте примеры команд,записывайте удачные находки на память, публикуйте их в твиттерах и блогах.

Вытащить из истории предыдущую команду, добавить в конвейер еще одну команду, запустить, повторить .См. также раздел «Составление конвейера-однострочника».

Базовые команды

  • переход в другой каталог: cd ;
  • просмотр содержимого файлов: саt , less , head , tail ;
  • манипуляции с файлами: cp , mv , rm ;
  • просмотр содержимого каталогов: ls , ls -l , ls -lS ;
  • структура каталогов: tree , tree -d (можно передать в качестве параметра каталог);
  • поиск файлов: find . -name ... ;

Аналитика

  • wc , wc -l ;
  • sort -k - сортировка по указанному полю;
  • sort -n - числовая соритровка;
  • diff - сравнение файлов;
  • grep , grep -v , grep -w , grep "\" , grep -E - поиск текста;
  • uniq , uniq -c - уникализация строк;
  • awk - в варианте awk "{print $1}" , чтобы оставить только первое поле из каждой строки, $1 можно менять на $2 , $3 и т.д.;

Диагностика системы

  • ps axuww - информация о процессах (запущенных программах), работающих на машине;
  • top - интерактивный просмотр самых ресурсоемких процессов;
  • df - занятое и свободное место на диске;
  • du - суммарный размер файлов в каталоге (рекурсивно с подкаталогами);
  • strace , ktrace - какие системные вызовы выполняет процесс;
  • lsof - какие файлы использует процесс;
  • netstat -na , netstat -nap - какие порты и сокеты открыты в системе.

Некоторых программ у вас может не быть, их надо установить дополнительно. Кроме того, некоторые опции этих программ доступны только привилегированным пользователям (root "у).

Массовое и полуавтоматическое выполнение

На первых порах пропускайте этот раздел, эти команды и конструкции понадобятся вам тогда, когда доберетесь до несложного шелльного скриптинга.
  • test - проврека условий;
  • while read - цикл по строчкам STDIN ;
  • xargs - подстановка строк из STDIN в параметры указанной программе;
  • seq - генерация последовательностей натуральных чисел;
  • () - объединить вывод нескольких команд;
  • ; - выполнить одно за другим;
  • && - выполнить при условии успешного завершения первой команды;
  • || - выполнить при условии неудачного завершения первой команды;
  • tee - продублировать вывод программы в STDOUT и в файл на диске.

Разное

  • date - текущая дата;
  • curl - скачивает документ по указаному url и пишет результат на STDOUT ;
  • touch - обновить дату модификации файла;
  • kill - послать процессу сигнал;
  • true - ничего не делает, возвращает истину, полезна для организации вечных циклов;
  • sudo - выполнить команду от имени root "а.

Составление конвейера-однострочника

Давайте рассмотрим пример реальной задачи: требуется прибить все процессы task-6-server , запущенные от имени текущего пользователя.

Шаг 1.
Понять, какая программа выдает примерно нужные данные, хотя бы и не в чистом виде. Для нашей задачи стоит получить список всех процессов в системе: ps axuww . Запустить.

Шаг 2.
Посмотреть на полученные данные глазами, придумать фильтр, который выкинет часть ненужных данных. Часто это grep или grep -v . Клавишей «Вверх» вытащить из истории предыдущую команду, приписать к ней придуманный фильтр, запустить.

Ps axuww |grep `whoami`
- только процессы текущего пользователя.

Шаг 3.
Повторять пункт 2, пока не получатся чистые нужные данные.

"
- все процессы с нужным именем (плюс, может быть, лишние вроде vim task-6-server.c и т.п.),

Ps axuww |grep `whoami` | grep "\" | grep -v vim ps axuww |grep `whoami` | grep "\" | grep -v vim |grep -v less
- только процессы с нужным именем

Ps axuww |grep `whoami` | grep "\" | grep -v vim |grep -v less |awk "{print $2}"

Pid-ы нужных процессов, п. 3 выполнен

Шаг 4.
Применить подходящий финальный обработчик. Клавишей «Вверх» вытаскиваем из истории предыдущую команду и добавляем обработку, которая завершит решение задачи:

  • |wc -l чтобы посчитать количество процессов;
  • >pids чтобы записать pid-ы в файл;
  • |xargs kill -9 убить процессы.

Задания для тренировки

Хотите попрактиковаться в новых умениях? Попробуйте выполнить следующие задания:
  • получите список всех файлов и каталогов в вашем домашнем каталоге;
  • получите список всех man -статей из категории 2 (системные вызовы);
  • посчитайте, сколько раз в man-е по программе grep встречается слово grep;
  • посчитайте, сколько процессов запущено в данный момент от имени пользователя root ;
  • найдите, какая команда встречается в максимальном количестве категорий справки (man);
  • подсчитайте, сколько раз встречается слово var на странице ya.ru .
Подсказка: вам понадобится find , grep -o , awk "{print $1}" , регулярные выражения в grep , curl -s .

Что изучать дальше?

Если командная строка начинает вам нравиться, не останавливайтесь, продолжайте совершенствовать свои навыки.

Вот некоторые программы, которые определенно вам пригодятся, если вы будете жить в командной строке:

  • find со сложными опциями
  • apropos
  • locate
  • telnet
  • netcat
  • tcpdump
  • rsync
  • screen
  • zgrep , zless
  • visudo
  • crontab -e
  • sendmail
Кроме того, со временем стоит освоить какой-нибудь скриптовый язык,например, perl или python , или даже их оба.

Кому это надо?

А стоит ли вообще изучать сегодня командную строку и шелльный скриптинг? Определенно стоит. Приведу только несколько примеров из требований Facebook к кандидатам, которые хотят поступить на работу в FB.
  • Tutorial

Зачем и для кого статья?

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

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

Статья касается полноценных unix-подобных окружений, с полнофункциональным шеллом (предпочтительно zsh или bash)и достаточно широким набором стандартных программ.

Что такое шелл

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

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

Типичный вид шелла:

Шелл - это основной способ для взаимодействия со всеми Unix-подобными серверными системами.

Где встречаются системы с командной строкой?

Где вас может поджидать unix-овый шелл, популярные варианты:
  • MacOS (bash);
  • удаленный доступ на сервер по работе или для личного веб-проекта;
  • домашний файл-сервер с удаленным доступом;
  • Ubuntu, PC-BSD на ноутбуке/десктопе - unix-подобные системы сегодня просты в установке и использовании.

Какие задачи разумно решать шеллом?

Естественные задачи, для которых шелл пригоден, полезен и незаменим:
  • интерактивная работа в терминале:
    • выполнение компиляции, запуск заданий через make;
    • сравнение текстовых файлов;
    • быстрый ad-hoc анализ данных (количество уникальных ip в логе, распределение записей по часам/минутам и т.п.);
    • разовые массовые действия (прибить много процессов; если работаете с системой контроля версий - ревертнуть или зарезолвить кучу файлов);
    • диагностика происходящего в системе (семафоры, локи, процессы, дескрипторы, место на диске и т.п.);
  • скриптование:
    • установочные скрипты, для выполнения которых нельзя рассчитывать на наличие других интерпретаторов - это не для новичков;
    • функции для кастомизации интерактивного шелла (влияющие на приглашение, меняющие каталог, устанавливающие переменные окружения) - тоже не совсем для новичков;
    • одноразовые скрипты типа массового перекодирования файлов;
    • makefile-ы.

Абсолютно первые шаги

Начинаем работу: войти и выйти

Убедитесь, что точно знаете, как запустить шелл и как из него выйти.

Если вы работаете за машиной, на которой установлена Ubuntu, вам надо запустить программу Terminal. По окончании работы можно просто закрыть окно.

На MacOS - тоже запустить Terminal.

Для доступа к удаленному серверу - воспользоваться ssh (если локально у вас MacOS, Ubuntu или другая unix-like система) или putty (если у вас Windows).

Кто я, где я?

Выполните следующие команды:
  • hostname - выводит имя машины (сервера), на которой вы сейчас находитесь;
  • whoami - выводит ваш логин (ваше имя в системе);
  • tree -d / |less - псевдографическое изображение дерева каталогов на машине; выход из пролистывания - q ;
  • pwd - выводит каталог, в котором вы сейчас находитесь; в командной строке вы не можете быть «просто так», вы обязательно находитесь в каком-то каталоге (=текущий каталог, рабочий каталог). Вероятно, текущий рабочий каталог выводится у вас в приглашении (prompt).
  • ls - список файлов в текущем каталоге; ls /home - список файлов в указанном каталоге;

История команд (history)

Важное свойство полноценной командной строки - история команд.

Выполните несколько команд: hostname , ls , pwd , whoami . Теперь нажмите клавишу «вверх». В строке ввода появилась предыдущая команда. Клавишами «вверх» и «вниз» можно перемещаться вперед и назад по истории. Когда долистаете до hostname , нажмите Enter - команда выполнится еще раз.

Команды из истории можно не просто выполнять повторно, а еще и редактировать. Долистайте историю до команды ls , добавьте к ней ключ -l (получилось ls -l , перед минусом пробел есть, а после - нет). Нажмите Enter - выполнится модифицированная команда.

Пролистывание истории, редактирование и повторное выполнение команд - самые типичные действия при работе в командной строке, привыкайте.

Copy-paste

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

Прекрасной особенностью текста является то, что его можно копировать и вставлять, это верно и для командной строки.

Попробуйте выполнить команду date +"%y-%m-%d, %A"
Вводили ли вы ее целиком руками или скопировали из статьи? Убедитесь, что вы можете ее скопировать, вставить в терминал и выполнить.

После того, как научитесь пользоваться man "ом, убедитесь, что можете скопировать и выполнить примеры команд из справки. Для проверки найдите в справке по программе date раздел EXAMPLES , скопируйте и выполните первый приведенный пример (на всякий случай: знак доллара не является частью команды, это условное изображение приглашения к вводу).

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

Ключи и опции

При исследовании истории команд вы уже столкнулись с тем, что у команды ls есть по крайней мере два варианта. Если вызвать ее просто так, она выводит простой список:

Akira@latitude-e7240: ~/shell-survival-quide> ls Makefile shell-first-steps.md shell-first-steps.pdf shell-survival-quide.md shell-survival-quide.pdf
Если же добавить ключ -l , к каждому файлу выводится подробная информация:

Akira@latitude-e7240: ~/shell-survival-quide> ls -l total 332 -rw-rw-r-- 1 akira akira 198 Feb 13 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 Feb 14 22:26 shell-first-steps.md -rw-rw-r-- 1 akira akira 146226 Feb 13 11:49 shell-first-steps.pdf -rw-rw-r-- 1 akira akira 16626 Feb 13 11:45 shell-survival-quide.md -rw-rw-r-- 1 akira akira 146203 Feb 13 11:35 shell-survival-quide.pdf
Это очень типичная ситуация: если к вызову команды добавлять специальные модификаторы (ключи, опции, параметры), поведение команды меняется. Сравните: tree / и tree -d / , hostname и hostname -f .

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

Ls -ld /home ls -l /home grep root /etc/passwd

man

man - справка по командам и программам, доступным на вашей машине, а также по системным вызовам и стандартной библиотеке C.

Попробуйте: man grep , man atoi , man chdir , man man .

Пролистывание вперед и назад делается кнопками «вверх», «вниз», «PageUp», «PageDown», выход из просмотра справки - кнопкой q . Поиск определенного текста в справочной статье: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям - клавиша n .

Все справочные статьи делятся на категории. Самые важные:

  • 1 - исполняемые программы и шелльные команды (wc , ls , pwd и т.п.);
  • 2 - системные вызовы (fork , dup2 и т.п.)
  • 3 - библиотечные функции (printf , scanf , cos , exec).
Указывать, из какой именно категории надо показать справку, нужно в случаях совпадений имен. Например, man 3 printf описывает функцию из стандартной библиотеки C, а man 1 printf - консольную программу с таким же именем.

Посмотреть список всех доступных на машине справочных статей можно с помощью команды man -k . (точка - тоже часть комады).

less

Когда в небольшом окне терминала надо просмотреть очень длинный текст (содержимое какого-то файла, длинный man и т.п.), используют специальные программы-«пейджеры» (от слова page/страница, то есть постраничные листатели). Самый популярный листатель - less , и именно он обеспечивает вам пролистывание, когда вы читаете man-ы.

Попробуйте и сравните поведение:

Cat /etc/bash.bashrc cat /etc/bash.bashrc |less

Можно передать файл в пролистыватель сразу в параметрах:

Less /etc/bash.bashrc

Пролистывание вверхи и вниз - кнопки «вверх», «вниз», «PageUp», «PageDown», выход - кнопка q . Поиск определенного текста: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям - клавиша n . (Узнаете инструкцию про man ? Ничего удивительного, для вывода справки тоже используется less .)

Права

С любым файлом или каталогом связан набор «прав»: право на чтение файла, право на запись в файл, право исполнять файл. Все пользователи делятся на три категории: владелец файла, группа владельца файла, все прочие пользователи.

Посмотреть права на файл можно с помощью ls -l . Например:

> ls -l Makefile -rw-r--r-- 1 akira students 198 Feb 13 11:48 Makefile
Этот вывод означает, что владельцу (akira) можно читать и писать файл, группе (students) - только читать, всем прочим пользователя - тоже только читать.

Если при работе вы получаете сообщение permission denied , это значит, что у вас недостаточно правна объект, с которым вы хотели работать.

Подробнее читайте в man chmod .

STDIN, STDOUT, конвейеры (пайпы)

С каждой исполняющейся программой связаны 3 стандартных потока данных: поток входных данных STDIN , поток выходных данных STDOUT , поток для вывода ошибок STDERR .

Запустите программу wc , введите текст Good day today , нажмите Enter, введтие текст good day , нажмите Enter, нажмите Ctrl+d. Программа wc покажет статистику по количеству букв, слов и строк в вашем тексте и завершится:

> wc good day today good day 2 5 24
В данном случае вы подали в STDIN программы двухстрочный текст, а в STDOUT получили три числа.

Теперь запустите команду head -n3 /etc/passwd , должно получиться примерно так:

> head -n3 /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin
В этом случае программа head ничего не читала из STDIN , а в STDOUT написала три строки.

Можно представить себе так: программа - это труба, в которую втекает STDIN , а вытекает STDOUT .

Важнейшее свойство юниксовой командной строки состоит в том, что программы-«трубы» можно соединять между собой: выход (STDOUT) одной программы передавать в качестве входных данных (STDIN) другой программе.

Такая конструкция из соединенных программ называется по-английски pipe (труба), по-русски - конвейер или пайп.

Объединение программ в конвейер делается символом | (вертикальная черта)

Выполните команду head -n3 /etc/passwd |wc , получится примерно следующее:

> head -n3 /etc/passwd |wc 3 3 117
Произошло вот что: программа head выдала в STDOUT три строки текста, которые сразу же попали на вход программе wc , которая в свою очередь подсчитала количество символов, слов и строк в полученном тексте.

В конвейер можно объединять сколько угодно программ. Например, можно добавить к предыдущему конвейеру еще одну программу wc , которая подсчитает, сколько слов и букв было в выводе первой wc:

> head -n3 /etc/passwd |wc |wc 1 3 24

Составление конвейеров (пайпов) - очень частое дело при работе в командной строке. Пример того, как это делается на практике, читайте в разделе «Составление конвейера-однострочника».

Перенаправление ввода-вывода

Вывод (STDOUT) програмы можно не только передать другой программе по конвейеру, но и просто записать в файл. Такое перенаправление делается с помощью > (знак «больше»):

Date > /tmp/today.txt
В результате выполнения этой команды на диске появится файл /tmp/today.txt . Посмотрите его содержимое с помощью cat /tmp/today.txt

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

Если надо не перезаписать файл, а добавить вывод в его конец, используйте >> :

Date >> /tmp/today.txt
Проверьте, что теперь записано в файле.

Кроме того, программе можно вместо STDIN передать любой файл. Попробуйте:

Wc

Что делать, когда что-то непонятно

Если вы сталкиваетесь с поведением системы, которое не понимаете, или хотите добиться определенного результата, но не знаете, как именно, советую действовать в следующем порядке (кстати, это относится не только к шеллам):
  • насколько возможно четко сформулируйте вопрос или задачу - нет ничего сложнее, чем решать «то, не знаю что»;
  • вспомните, сталкивались ли вы уже с такой же или подобной проблемой - в этом случае стоит попробовать решение, которое сработало в прошлый раз;
  • почитайте подходящие man-ы (если понимаете, какие man-ы подходят в вашем случае) - возможно, вы найдете подходящие примеры использования команд, нужные опции или ссылки на другие команды;
  • подумайте: нельзя ли немного поменять задачу? - возможно, чуть-чуть изменив условия, вы получите задачу, которую уже умеете решать;
  • задайте свой четко сформулированный вопрос в поисковой системе - возможно, ответ найдется на Stack Overflow или других сайтах;
Если ничего из перечисленного не помогло - обратитесь за советом к преподавателю, опытному коллеге или товарищу. И не бойтесь задавать «глупые» вопросы - не стыдно не знать, стыдно не спрашивать.

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

Методы работы

Скопировать-и-вставить - из man-ов, из статей на StackOverflow и т.п.Командная строка состоит из текста, пользуйтесь этим: копируйте и используйте примеры команд,записывайте удачные находки на память, публикуйте их в твиттерах и блогах.

Вытащить из истории предыдущую команду, добавить в конвейер еще одну команду, запустить, повторить .См. также раздел «Составление конвейера-однострочника».

Базовые команды

  • переход в другой каталог: cd ;
  • просмотр содержимого файлов: саt , less , head , tail ;
  • манипуляции с файлами: cp , mv , rm ;
  • просмотр содержимого каталогов: ls , ls -l , ls -lS ;
  • структура каталогов: tree , tree -d (можно передать в качестве параметра каталог);
  • поиск файлов: find . -name ... ;

Аналитика

  • wc , wc -l ;
  • sort -k - сортировка по указанному полю;
  • sort -n - числовая соритровка;
  • diff - сравнение файлов;
  • grep , grep -v , grep -w , grep "\" , grep -E - поиск текста;
  • uniq , uniq -c - уникализация строк;
  • awk - в варианте awk "{print $1}" , чтобы оставить только первое поле из каждой строки, $1 можно менять на $2 , $3 и т.д.;

Диагностика системы

  • ps axuww - информация о процессах (запущенных программах), работающих на машине;
  • top - интерактивный просмотр самых ресурсоемких процессов;
  • df - занятое и свободное место на диске;
  • du - суммарный размер файлов в каталоге (рекурсивно с подкаталогами);
  • strace , ktrace - какие системные вызовы выполняет процесс;
  • lsof - какие файлы использует процесс;
  • netstat -na , netstat -nap - какие порты и сокеты открыты в системе.

Некоторых программ у вас может не быть, их надо установить дополнительно. Кроме того, некоторые опции этих программ доступны только привилегированным пользователям (root "у).

Массовое и полуавтоматическое выполнение

На первых порах пропускайте этот раздел, эти команды и конструкции понадобятся вам тогда, когда доберетесь до несложного шелльного скриптинга.
  • test - проврека условий;
  • while read - цикл по строчкам STDIN ;
  • xargs - подстановка строк из STDIN в параметры указанной программе;
  • seq - генерация последовательностей натуральных чисел;
  • () - объединить вывод нескольких команд;
  • ; - выполнить одно за другим;
  • && - выполнить при условии успешного завершения первой команды;
  • || - выполнить при условии неудачного завершения первой команды;
  • tee - продублировать вывод программы в STDOUT и в файл на диске.

Разное

  • date - текущая дата;
  • curl - скачивает документ по указаному url и пишет результат на STDOUT ;
  • touch - обновить дату модификации файла;
  • kill - послать процессу сигнал;
  • true - ничего не делает, возвращает истину, полезна для организации вечных циклов;
  • sudo - выполнить команду от имени root "а.

Составление конвейера-однострочника

Давайте рассмотрим пример реальной задачи: требуется прибить все процессы task-6-server , запущенные от имени текущего пользователя.

Шаг 1.
Понять, какая программа выдает примерно нужные данные, хотя бы и не в чистом виде. Для нашей задачи стоит получить список всех процессов в системе: ps axuww . Запустить.

Шаг 2.
Посмотреть на полученные данные глазами, придумать фильтр, который выкинет часть ненужных данных. Часто это grep или grep -v . Клавишей «Вверх» вытащить из истории предыдущую команду, приписать к ней придуманный фильтр, запустить.

Ps axuww |grep `whoami`
- только процессы текущего пользователя.

Шаг 3.
Повторять пункт 2, пока не получатся чистые нужные данные.

"
- все процессы с нужным именем (плюс, может быть, лишние вроде vim task-6-server.c и т.п.),

Ps axuww |grep `whoami` | grep "\" | grep -v vim ps axuww |grep `whoami` | grep "\" | grep -v vim |grep -v less
- только процессы с нужным именем

Ps axuww |grep `whoami` | grep "\" | grep -v vim |grep -v less |awk "{print $2}"

Pid-ы нужных процессов, п. 3 выполнен

Шаг 4.
Применить подходящий финальный обработчик. Клавишей «Вверх» вытаскиваем из истории предыдущую команду и добавляем обработку, которая завершит решение задачи:

  • |wc -l чтобы посчитать количество процессов;
  • >pids чтобы записать pid-ы в файл;
  • |xargs kill -9 убить процессы.

Задания для тренировки

Хотите попрактиковаться в новых умениях? Попробуйте выполнить следующие задания:
  • получите список всех файлов и каталогов в вашем домашнем каталоге;
  • получите список всех man -статей из категории 2 (системные вызовы);
  • посчитайте, сколько раз в man-е по программе grep встречается слово grep;
  • посчитайте, сколько процессов запущено в данный момент от имени пользователя root ;
  • найдите, какая команда встречается в максимальном количестве категорий справки (man);
  • подсчитайте, сколько раз встречается слово var на странице ya.ru .
Подсказка: вам понадобится find , grep -o , awk "{print $1}" , регулярные выражения в grep , curl -s .

Что изучать дальше?

Если командная строка начинает вам нравиться, не останавливайтесь, продолжайте совершенствовать свои навыки.

Вот некоторые программы, которые определенно вам пригодятся, если вы будете жить в командной строке:

  • find со сложными опциями
  • apropos
  • locate
  • telnet
  • netcat
  • tcpdump
  • rsync
  • screen
  • zgrep , zless
  • visudo
  • crontab -e
  • sendmail
Кроме того, со временем стоит освоить какой-нибудь скриптовый язык,например, perl или python , или даже их оба.

Кому это надо?

А стоит ли вообще изучать сегодня командную строку и шелльный скриптинг? Определенно стоит. Приведу только несколько примеров из требований Facebook к кандидатам, которые хотят поступить на работу в FB.

    Операционные системы семейства Linux, как впрочем, и любые другие ОС, предполагают наличие интерфейса взаимодействия между компонентами компьютерной системы и конечным пользователем, т. е. наличие программного уровня, который обеспечивает ввод команд и параметров для получения желаемых результатов. Такой программный уровень получил название "оболочка" или, на английском языке - shell .

Что такое оболочка?

Командная оболочка (shell ) обеспечивает взаимотействие между пользователем и средой операционной системы Linux. Она является специализированным программным продуктом, который обеспечивает выполнение команд и получения результатов их выполнения, или, если совсем уж упрощенно, оболочка - это программа, которая предназначена для обеспечения выполнения других программ по желанию пользователя. Примером оболочки может быть, например, интерпретатор команд command.com операционной системы MS DOS, или оболочка bash операционных систем Unix / Linux.

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

Интерпретация командной строки.

Доступ к командам и результатам их выполнения.

Поддержка переменных, специальных символов и зарезервированных слов.

Обработка файлов, операций стандартного ввода и вывода.

Реализация специального языка программирования оболочки.

    Для операционных систем семейства Unix / Linux возможно использование нескольких различных оболочек, отличающихся свойствами и методами взаимодействия с системой. Наиболее распространенными оболочками являются

sh - оболочка Bourne , классическая оболочка для ОС Unix

bash оболочка Bourne Again (GNU Bourne-Again SHell). Пожалуй, наиболее распространенная на данный момент, оболочка в среде ОС семейства Linux.

ksh - оболочка Korn , разработанная в качестве развития оболочки Bourne с историей командной строки и возможностью редактирования команд.

csh - оболочка C , использующая синтаксис популярного языка программирования C

tcsh - версия оболочки C с интерактивным редактированием командной строки.

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

    В процессе загрузки операционных систем семейства Linux, после загрузки ядра системы выполняется переход в интерактивный режим – режим взаимодействия пользователя и операционной системы. В ОС Linux, первым запускаемым в ходе загрузки процессом, является программа инициализации init , которая считывает содержимое конфигурационного файла /etc/inittab , определяет перечень и характеристики терминалов, имеющихся в системе, и вызывает программу интерактивного входа getty , отображающую приглашение для ввода имени пользователя. После ввода имени пользователя и пароля, программа getty вызывает программу login , которая проверяет достоверность учетной записи, выполняет переход в домашний каталог пользователя и передает управление программе начального запуска сеанса, в качестве которой обычно используется программа оболочки пользователя, конкретная разновидность которой определяется содержимым файла /etc/passwd для данной учетной записи. Например:

user1:x:508:511::/home/user1:/bin/sh
interbase:x:510:511::/home/interbase:/bin/csh
apb:x:511:513:apb:/home/apb:/bin/bash

Как видно из содержимого файла /etc/passwd , для пользователя user1 будет запущена оболочка sh (оболочка Bourne), для пользователя interbase - оболочка csh (оболочка C) и для пользователя apb - оболочка bash (Bourne Again). После старта оболочки, на экран выводится приглашение к вводу команд (обычно в виде знака доллара $ , если работа выполняется в контексте учетной записи обычного пользователя, или фунта # , если оболочка используется под учетной записью привилегированного пользователя (root ).

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

Посредством команды exit выполненной пользователем

При получении процессом оболочки сигнала kill , отправленного ядром, например при перезагрузке системы.

Интерпретация командной строки.

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

ls -l file01 file02

Содержит команду ls , опцию -l и два имени файлов file01 file02 .

При использовании нескольких опций, их можно объединять. Например, варианты следующих команд идентичны:

Ls -l -d
ls -ld

Команды, являющиеся частью оболочки, называются встроенными . К таким командам относятся, например, cd, if, case и т. п. Естественно, встроенные команды могут отличаться для различных вариантов оболочек. Кроме встроенных команд, возможно использование программных модулей, представляющих собой отдельные исполняемые файлы, или файлов скриптов или сценариев - обычных текстовых файлов, содержащих последовательно выполняемые строки с командами оболочки. Некоторые скрипты (сценарии) могут выполняться процессами Linux, как например, планировщиком задач cron . Планировщик задач, как правило, предназначен для автоматического выполнения задач администрирования системы по расписанию. Задачи cron представляют собой команды или скрипты и выполняются автоматически, без какого либо вмешательства человека и могут выполняться в контексте разных учетных записей пользователей. В случае, когда задача планировщика предполагает выполнение какого-либо скрипта, возникает проблема выбора оболочки, которая должна быть запущена в качестве дочернего процесса cron для обработки команд из файла скрипта - ведь оболочка может быть любой, а синтаксис скрипта, как правило, предполагает использование конкретной оболочки, под которую он написан. Для устранения данной проблемы, в ОС семейства Linux принято в первой строке скрипта указывать разновидность оболочки, необходимой для его выполнения, в виде:

#!/bin/bash - для оболочки bash

#!/bin/sh - для оболочки sh

Знак # является признаком комментария и следующие за ним символы не интерпретируются в качестве команды. Такой прием позволяет явно указать, какая оболочка должна быть использована для обработки последующего содержимого файла. Если же скрипт не содержит запись, явно определяющую требуемую оболочку, то будут использованы настройки из учетной записи, в контексте которой выполняется данный скрипт. В этом случае, возможна ситуация, когда скрипт, написанный для оболочки, например, tch будет передан для выполнения в оболочку bash , что приведет к невозможности его выполнения.

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

/etc/profile - устанавливает переменные только для командных оболочек. Может запускать любые скрипты в оболочках, совместимых с Bourne shell.

/etc/bash.bashrc - устанавливает переменные только для интерактивных оболочек. Он также запускает bash-скрипты.

/etc/environment - используется модулем PAM-env. В этом файле можно указывать только пары имя=значение .

Каждый из этих файлов имеет свои особенности применения, поэтому следует внимательно выбирать тот, который подходит для ваших целей. Например, если нужно добавить пользовательский каталог ~/bin в переменную PATH для всех пользователей, поместите следующий код в один из системных файлов инициализации окружения (/etc/profile или /etc/bash.bashrc):

# Если идентификатор ID пользователя более или равно 1000, и существует каталог ~/bin, и он

#не был ранее добавлен в переменную PATH,

# выполнить экспорт ~/bin в переменную $PATH.

If [[ $UID -ge 1000 && -d $HOME/bin && -z $(echo $PATH | grep -o $HOME/bin)

Export PATH=$HOME/bin:${PATH}

Как правило, в операционных системах Linux, идентификатор пользователя менее 1000 или менее 500 используется для служебных учетных записей. В данном примере, переменная окружения будет установлена для всех локальных пользователей системы с идентификатором 1000 или более.

Если же нужно изменить среду окружения для конкретного пользователя, используется модификация содержимого среды окружения пользователя:

- ~/.bash_profile , ~/.bash_login и т.п. - файлы инициализации командной оболочки из домашнего каталога пользователя.

- ~/.profile - файл инициализации профиля пользователя. Используется многими оболочками для определения переменных среды.

~/.pam_environment - пользовательский аналог файла /etc/environment, который используется модулем PAM-env.

Например, чтобы добавить каталог пользователя ~/bin в пути поиска исполняемых файлов, заданных переменной PATH , можно например, в файл ~/.profile поместить строку:

export PATH="${PATH}:/home/пользователь/bin"

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

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

export PATH=~/bin:$PATH

Новое значение переменной PATH будет действовать только до завершения текущего сеанса пользователя.

Для просмотра значения переменной можно использовать команду echo $переменная , например:

echo $PATH

В настоящее время, самой распространенной оболочкой, как уже упоминалось выше, является bash . Вызвано это, в первую очередь тем, что оболочка bash является sh - совместимой командной оболочкой, в которую добавлены полезные возможности из оболочек Korn shell (ksh ) и C shell (csh ). Оболочка bash может без какой-либо модификации выполнять большинство скриптов, написанных под язык программирования оболочки sh и в максимальной степени пытается приблизиться к стандарту POSIX , что привело к появлению множества улучшений, причем как для программирования, так и использования в интерактивном режиме. В современной реализации bash имеется режим редактирования командной строки, неограниченный размер истории команд, средства управление заданиями, возможность использования псевдонимов, обширный перечень встроенных команд, функции командной оболочки и т.п. В целом, bash в наибольшей степени соответствует потребностям среднестатистического пользователя, что и сделало ее наиболее используемой в среде Linux.

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



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: