© Георгиевский Анатолий, Барышков Дмитрий, 08.03.2006 - 06.02.2011

Программирование на Bash

В статье коротко рассомтрены некоторые способы работы с командной строкой в Linux (bash), даются основы составления командных файлов (скриптов). Цель статьи познакомить пользователей Виндовс с основами работы в режиме командной строки. Данный раздел курса дает необходимый уровень знаний для работы на вычислительном кластере.

Пользователям Виндовс рекомендуется установить пакет MSYS. Пакет предоставляет минимальное окружение для сборки приложений GNU. В состав пакета входит интерпретатор командной строки, поддерживающий всю функциональность командной строки GNU/Linux.

Операционная система GNU

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

  • Возможнось унифицированного взаимодействия программ с операционной системой. Обеспечивается совместимостью со стандартом POSIX.
  • Стандартизация процедуры конфигурации и сборки программных продуктов, формирование обязательного набора программных утилит для сборки.
  • Унификация интерпретатора команд (shell), оболочки для запуска приложений.

Изначально операционная система GNU создавалась, как идея открытого программного обеспечения в противовес коммерческим операционным системам, в частности Unix. Сегодня бурное развитие открытого программного обеспечения под лицензией GNU позволяет говорить не только об идеологии построения и использования программных продуктов, но и о вытеснении коммерческих продуктов с рынка. Чем свободное программное обеспечение отличается от рекламных акций пивных компаний можно почитать на сайте GNU.

Операционная система GNU состоит из ядра, libc, интерпретатора команд и набора утилит. Ядро системы может быть любым, хоть бы Windows-kernel. Чаще всего в качестве ядра операционной системы GNU используется Linux, возможно использование ядра FreeBSD, планируется выпуск GNU/Hurd. libc - реализация стандартных библиотек языка C. Именно библиотека libc обеспечивает взаимодействие программ с операционной системой. Никакой набор утилит не является полным, однако можно выделить минимальный ряд утилит, которые встречаются в любой Unix-системе.

ls, cp, rm, mkdir, ln, cat, grep, less, ps, info или man

Подробнее про каждую из этих команд следует посмотреть при помощи справки man или info.

При работе с программным обеспечением GNU меня всегда радует фраза поперек экрана ABSOLUTELY NO WARRANTY. Принцип свободного программного обеспечения - отказ от ответственности за последствия использования программного продукта. Даже если в учебнике написано делай так-то и результат будет таким-то, следует разобраться с каждой командой и почитать документацию по каждой из команд. В некоторых случаях даже чтение документации оказывается недостаточным для понимания, тогда можно поизучать исходные коды программ. Если код вам не понравился, в него можно вносить изменения, лицензия это допускает.

Пользователи Виндовс привыкают воспринимать программное обеспечение образно, сопоставляя функции програм со зрительными образами, не вникая в суть действий. При работе с операционной системой GNU приходится глубже разбираться в принципах работы и настройках програмного обеспечения. Даже при использовании графических оболочек имеется однозначное соответсвие между действиями мышкой и командной строкой. Любое действие выполненное из графической оболочки можно выполнить из командной строки. Опытные пользователи GNU/Linux даже при наличии оболочек по дизайну и функциональности не уступающих Windows, всё равно предпочитают работать в режиме терминала, особенно когда графические средства не несут дополнительной информации, просто потому что быстрее стучать по десяти кнопкам, чем по одной, интуитивно используя азбуку морзе для формирования управляющих команд.

Загрузчик операционной системы

Функция загрузчика - начальная загрузка операционной системы. В функцию загрузчика должны входить задачи: инициализации памяти и оборудования, настройка терминального устройства и загрузка образа системы в оперативную память, передача управления системе. Загрузчик не является частью операционной системы. В архитектуре х86 задачи инициализации оборудования частично решаются средствами Bios, затем происходит загрузка загрузчика ОС с выбранного устройства.

Функции ядра операционной системы

Для совместимости со стандартом POSIX ядро ОС должно поддерживать порядка двухсот системных вызовов. Ядро операционной системы GNU должно поддерживать системные вызовы glibc. К основным функциям ядра можно отнести управление распределением основных ресурсов системы. К основным ресурсам относятся: время процессора, оперативная память. Дополнительно к функциям ядра можно отнести работу с файловыми системами, поддержку сетевых протоколов, обеспечние взаимодействия процессов, абстрактное обслуживание оборудования системы и периферийных устройств. Ядро должно поддерживать по крайней мере одино терминальное устройство и возможность перенаправления вывода на абстрактное терминальное устройство. Должна подерживаться отладка операционной системы и приложений.

Рецепт успеха создания своей собственной операционной ситсемы GNU/мое_имя состоит в реализации менеджера памяти, очереди процессов, абстрактного интерфейса подключения программных модулей драйверов устройств, и реализации вызовов библиотеки glibc. Начинать надо с терминала и возможности отладки через терминал. Если к реализованному подмножеству системных вызвов удасться прикрутить оболочку bash, всё остальное будет прикручиваться само собой. В качестве дополнительной литературы рекомендуется изучить пособие [Современные операционные системы. Эндрю Таненбаум].

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

Интерпретатор команд

Обычно в качестве интерпретатора команд используется bash (The GNU Bourne-Again SHell), который реализует стандарт (IEEE POSIX Shell). Более подробное описание работы командного интерпретатора bash можно получить с помошью справки.

$ info bash

Встроенные команды

Кроме возможности запуска утилит командный интерпретатор реализует небольшой набор собственных команд

help, cd, pwd, bg, fg, jobs, kill, exit ...

help
встроенная справка по командам bash
cd
переход между папками директории
pwd
отображает текущую раскрытую папку в директории
export ИМЯ_ПАРАМЕТРА=ЗНАЧЕНИЕ
Определение параметра, действует в течение сессии и передается всем дочерним процессам вместе с параметрами среды.

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

Перенаправление потоков ввода/вывода

команда > имя_файла
- угловая скобка - перенаправление стандатного выходного потока в файл.
команда >> имя_файла
- две угловые скобки - добавление выходного потока в конец файла.
команда < имя_файла
- угловая скобка - перенаправление данных из файла на стандартный вход команды.
утилита_1 | утилита_2
- вертикальная черта - перенаправление стандартного вывода утилиты_1 на стандартный ввод утилиты_2
`команда`
- команда в обратных кавычках. Преобразование многострочного вывода команды в одну строку.

Переменные

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

переменная=значение
-

Переменная может применяться в составе последующих команд с использованием префикса '$'. Переменная может вставляться как подстрока в шаблон строки, например

переменная="текстовый шаблон ${id}"
- для выделения переменной в шаблоне могут использоваться фигурные скобки

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

переменная=`командная строка`
- стандартный вывод командной строки будет помещен в переменную

В bash поддерживаются встроенные переменные:
$0 -- название скрипта
$1,$2,...,$n -- параметры, переданные скрипту
$# -- число параметров, переданных скрипту
$? -- код возврата последнего процесса
$$ -- PID текущего процесса (PID - номер процесса в таблице процессов)
$! -- PID последнего процесса, запущенного в фоновом режиме
$@ -- список параметров, переданных скрипту
$* -- все параметры единой строкой

Синхронное и асиннхронное исполнение команд

команда_1 ; команда_2
- точка с запятой - последовательное исполнение команд
команда &
- амперсанд - интерпретатор не дожидается завершения команды, выполнение программы происходит в фоновом режиме.

Управление заданиями

Управление заданиями осуществляется встроенными командами:

.имя_программы
точка перед именем скрипта или программы вызывает запуск программы относительно текущей директории.
fg, bg
- переключение между фоновой задачей и основной задачей. Комбинация клавиш
Ctrl-Z
вызывает остановку выполнения основной задачи, позволяет начать выполнение другого задания. Манипуляция заданиями, например, оказываетя удобным средством при изучении документации и редактировании файлов конфигурации.
jobs
- отображает список запущенных заданий
kill
- передать управляющий сигнал программе, команда вызывает завершение работы процесса.

Встроенный язык программирования

Операционная система распознает файлы скриптов по первой строке, которая должна содержать комментарий #! /bin/sh, затем вызывает соответствующий интерпретатор.


POSIX
группа стандартов основанная на опыте построения ОС Unix. IEEE POSIX 1003.1 Часть 2. описывает требования к интерпретатору команд и набру утилит. Часть 3. описывает системные интерфейсы, часть из которых реализуется в библиотеке libc.
Хакер
в среде разработчиков открытого программного обеспечения термином "хакер", имеющим в бытовой интерпретации негативный смысл, на самом деле означают системных программистов.

( - )