Найти в Дзене
Одиночная палата

/GNUser/Linux для программиста/02-Bash

Оглавление

POSIX

Кто такой "позикс" и с чем его едят? Строго говоря, это набор стандартов. Такой же как ГОСТ, ISO, только POSIX. С точки зрения программиста обычно под позиксом подразумеваются только две первые его части про API и про командную оболочку. С точки же зрения пользователя это, в основном только, вторая часть - POSIX.2. Командная оболочка и утилиты. Это довольно обширный документ закрывающий все принципы и правила использования стандартного набора команд.

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

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

Стандартом, кроме команд, описываются и многие другие важные и полезные вещи как потоки ввода-вывода, конвейеры, регулярные выражения и тому прочее. Таким образом всякая система, реализующая стандарт является POSIX совместимой. К таковым относятся практически все UNIX, в том числе MacOS X, частично BSD, iOS, и по большей части Linux, включая Android. Короче говоря, POSIX НЕсовместимой, после смерти Netware и Symbian, является по сути только Windows.

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

Bourne Again

Разумеется, bash (Bourne Again Shell) не единственная и не самая идеологически правильная оболочка. Есть, например, упомянутый BSD вариант tcsh, более каноничный csh, продвинутый ksh, просто sh, ну и так далее. Но поскольку она POSIX совместима, то и какая, собственно, разница. Из всех оболочек, с которыми мне приходилось сталкиваться, bash помимо всего прочего, как правило, красиво раскрашена, имеет меньше всех проблем с разными вариантами терминалов и устройств ввода вывода, с языками и кодировками. А для систем Windows доступен для свободной установки cygwin.

Оболочка одновременно является и простым интерпретатором. В ней работают циклы, условные операторы и даже некое подобие функций и макросов. В связке с такими мощными инструментами как grep, awk и sed на bash можно почти полноценно программировать. Что бы программировать не почти, а совсем полноценно, американский гражданин Ларри Уолл однажды даже собрал все это в кучу, немного допилил и назвал все это Perl. Потом его увидел другой - датский - гражданин Расмус Лердорф, посчитал, что выглядит он не очень красиво, сделал похожим на C++ и назвал его PHP. Хотя, сегодня не совсем об этом.

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

Однако кое какие приемчики могут оказаться полезными и для них. Не всегда, например, в системе доступен компилятор любимого языка. Возникает необходимость, что-то быстренько проверить, исключить ошибку, протестировать API. Спектр таких задач на самом деле достаточно широк если представлять, как воспользоваться возможностями самой системы и командной оболочки.

Конвейеры

Одной из незаслуженно забытых, ну или не так часто используемых, фич POSIX систем являются конвееры или пайплайны (pipeline). Это довольно простой и интуитивно понятный способ использования стандартных потоков ввода-вывода. Если перенаправление потоков при помощи операторов '>', '<' или '>>', '<<' используется чаще, то об операторе '|' - конвейер - создается такое ощущение, что люди начинают постепенно забывать. А, между прочим, он есть и в Windows.

$ netstat | more

Уже лучше чем мотать обратно, тем более что по умолчанию буфер консоли обычно ограничен какими-то смешными значениями. А как вам такое?

$ netstat -an | grep LISTEN

И совсем хорошо.

$ locate ~/ | grep history | less

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

Ну и можно соответственно комбинировать это все с разнообразными перенаправлениями и составными командами.

$ read -s && echo -e "[client]user=xxx\npassword="$REPLY | mysql --defaults-file=/dev/stdin -e 'show databases'

А может быть вы не знали что есть такая специальная команда 'yes'?

Многозадачность

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

В общем запускаем что-то нибудь долгое, пусть будет '$ sleep 500', и жмем CTRL+Z. Смысла в такой команде мало, но допустим. Теперь можно этот процесс засунуть в фоновый режим - '$ bg 1'. Или вытащить обратно на первый план - '$ fg 1'. Такими нехитрыми действиями можно, например, создавать какие-то подобия серверов. Или просто переключаться между открытыми в редакторах файлами. Также можно слать в фон сразу любую команду дописав в конце строки '&'.

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

$ while true; do echo $RANDOM >> random.log; sleep 1; done &

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

$ tail -n 10 random.log | md5sum

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

$ sleep 60 && kill %2 &

Есть и куда более изощренные способы манипуляции задачами, перенаправлением и конвейерами, но это опять же скорее для специалистов. А мы с вами можем двигаться дальше, потому как это всего лишь самые самые встроенные функции. Есть и масса других, не менее интересных, встроенных команд как то 'ls' с кучей параметров, 'ps' - посмотреть процессы, куда же без cat, set, export, date и прочего хозяйства. Однако, мне кажется, они чуть менее интересны и довольно очевидны.

Man

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

$ man man

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

$ man -k calendar

Кроме этого если внутри 'man' ткнуть 'h'. То можно посмотреть какими клавишами по нему лазить приятнее всего. Эти горячие клавиши и их сочетания, что вам уже, наверное, привычно слышать, тоже стандартизированы. То есть они будут работать практически во всех консольных просмотрщиках и редакторах. И если вы не собираетесь забыть Linux и все что с ним связано после данной заметки как страшный сон, то неплохо некоторые из них запомнить наизусть.

А если желание и дальше постигать хитрости bash и его друзей еще не пропало, то перед тем как перейти к более навороченным командам и способам их использования полезно заглянуть и в их мануалы. В следующей заметке пробежимся по grep, awk, sed, diff и другим полезным утилитам для работы с файлами.

SEE ALSO

/GNUser/Linux для программиста/01

:wq