Для обеспечения интерфейса командной строки в ОС часто используются командные интерпретаторы, которые могут представлять собой самостоятельные языки программирования, с собственным синтаксисом и отличительными функциональными возможностями.
В операционные системы Windows 9x включён командный интерпретатор command.com , в Windows NT включён командных оболочек UNIX популярны csh, ksh и другие.
Как правило, при низкоуровневой настройке ОС у пользователя есть возможность менять командный интерпретатор, используемый по умолчанию.
Командный интерпретатор исполняет команды своего языка, заданные в командной строке или поступающие из стандартного ввода или указанного файла .
В качестве команд интерпретируются вызовы системных или прикладных утилит , а также управляющие конструкции. Кроме того, оболочка отвечает за раскрытие шаблонов имен файлов и за перенаправление и связывание ввода-вывода утилит.
В совокупности с набором утилит, оболочка представляет собой операционную среду , полноценный язык программирования и мощное средство решения как системных, так и некоторых прикладных задач, в особенности, автоматизации часто выполняемых последовательностей команд.
Наряду со стандартными, в открытых ОС применяются также альтернативные оболочки tcsh, отличающиеся синтаксисом управляющих конструкций и поведением переменных.
Некоторые альтернативные ОС поставляются с интерпретаторами собственных языков командных файлов (такими, как язык командных файлов ОС Microsoft Windows NT, язык OS/2 и т. п.)
Некоторые предпочитают пользоваться для автоматизации часто выполняемых последовательностей команд новыми интерпретируемыми языками, например, Python.
Последние версии ОС Windows используют в качестве своей оболочки интегрированную среду Проводника Windows . Проводник Windows представляет собой визуальную среду управления включающую в себя Рабочий стол, Меню пуск, Панель задач, а также функции управления файлами. Ранние версии ОС Windows 3.xx в качестве графической оболочки включают менеджер программ.
Многие сторонние разработчики предлагают альтернативные среды, которые могут быть использованы вместо оболочки проводника, включенной по умолчанию компанией Microsoft в систему Windows.
Wikimedia Foundation . 2010 .
- (англ. Unix shell, часто просто «шелл» или «sh») командный интерпретатор, используемый в операционных системах семейства UNIX, в котором пользова … Википедия
У этого термина существуют и другие значения, см. Wish. wish (Windowing Shell) это простая сценарная или интерактивная командная оболочка UNIX для X Window System и Mac OS X. Она предоставляет пользователям возможность контролировать компоненты… … Википедия
- … Википедия
Сюда перенаправляется запрос Интерпретатор командной строки. На тему «Интерпретатор командной строки» нужна отдельная статья. Внешний вид оболочки (англ. Co … Википедия
Оболочка операционной системы (от англ. shell оболочка) интерпретатор команд операционной системы (ОС), обеспечивающий интерфейс для взаимодействия пользователя с функциями системы. В общем случае, различают оболочки с двумя типами интерфейса для … Википедия
Командная оболочка UNIX (англ. Unix shell, часто просто «шелл» или «sh») командный интерпретатор, используемый в операционных системах семейства POSIX совместимые оболочки, восходящие к Bourne shell, появившемуся в Unix Version 7. Содержание 1… … Википедия
Командная оболочка UNIX (англ. Unix shell, часто просто «шелл» или «sh») командный интерпретатор, используемый в операционных системах семейства POSIX совместимые оболочки, восходящие к Bourne shell, появившемуся в Unix Version 7. Содержание 1… … Википедия
Командная оболочка UNIX (англ. Unix shell, часто просто «шелл» или «sh») командный интерпретатор, используемый в операционных системах семейства POSIX совместимые оболочки, восходящие к Bourne shell, появившемуся в Unix Version 7. Содержание 1… … Википедия
wish (командная оболочка UNIX) - У этого термина существуют и другие значения, см. Wish. wish (Windowing Shell) это простая сценарная или интерактивная командная оболочка UNIX для X Window System и Mac OS X. Она предоставляет пользователям возможность контролировать компоненты… … Википедия
Командная оболочка - Оболочка операционной системы (от англ. shell оболочка) интерпретатор команд операционной системы (ОС), обеспечивающий интерфейс для взаимодействия пользователя с функциями системы. В общем случае, различают оболочки с двумя типами интерфейса для … Википедия
Оболочка UNIX
Unix shell - Командная оболочка UNIX (англ. Unix shell, часто просто «шелл» или «sh») командный интерпретатор, используемый в операционных системах семейства POSIX совместимые оболочки, восходящие к Bourne shell, появившемуся в Unix Version 7. Содержание 1… … Википедия
Unix Shell - Командная оболочка UNIX (англ. Unix shell, часто просто «шелл» или «sh») командный интерпретатор, используемый в операционных системах семейства POSIX совместимые оболочки, восходящие к Bourne shell, появившемуся в Unix Version 7. Содержание 1… … Википедия
Командная строка - Сюда перенаправляется запрос Интерпретатор командной строки. На тему «Интерпретатор командной строки» нужна отдельная статья. Внешний вид оболочки (англ. Co … Википедия
UNIX System V - Множество потомков System V … Википедия
Unix System V - Множество потомков System V AT T UNIX System V одна из версий операционной системы 1989 г. Было выпущено 4 основные версии Releases 1, 2, 3 и 4. Версия System V Release 4 (SVR4) была наиболее удачной и популярной и послужила источником для… … Википедия
UNIX - Генеалогическое древо UNIX систем UNIX (читается юникс) семейство переносимых, многозадачных и многопользовательских … Википедия
Unix - Генеалогическое древо UNIX систем UNIX (читается юникс) группа переносимых, многозадачных и многопользовательских операционных систем. Первая система UNIX была разработана в 1969 г. в подразделении Bell Labs компании AT T. С тех пор было создано … Википедия
Аннотация:
Понятие командной оболочки. Обзор командных оболочек. Командная оболочка bash . Особенности работы (история команд, оператор "!" , действия по нажатию клавиши
1. В мире Linux и Unix работа на компьютере неразрывно связана с понятием командная оболочка (shell) – программа , позволяющая пользователю взаимодействовать с системой посредством ввода и выполнения команд. Тем не менее, командная оболочка является обычной программой. Доказать это можно, установив в качестве оболочки по умолчанию в файле passwd для пользователя другую программу. Но для того, чтобы система знала ее как оболочку, необходимо добавить абсолютное имя файла в /etc/shells .
В составе Linux идет несколько командных оболочек, их состав может меняться в зависимости от дистрибутива, но всегда вы сможете обнаружить:
Bourne Shell (sh) – самая старая и самая распространенная командная оболочка для Unix-систем. Нет ни одной системы Unix, где она бы не применялась.
Bourne Again Shell (bash) – расширенная Bourne Shell . Обладает массой приятных преимуществ, поэтому стала так популярна в последнее время. Является оболочкой " по умолчанию" практически для всех дистрибутивов Linux.
Также популярными оболочками являются:
csh – оболочка , система команд которой близка к языку программирования C
tcsh – оболочка , система команд которой близка к языку программирования Tcl .
zsh – оболочка , обладающая, наверное, самыми широкими возможностями. Является расширением sh (bourne shell) .
Поскольку в Linux " по умолчанию" используется bash , то о ней мы и поговорим.
2. Командная оболочка bash изначально являлась свободно-распространяемым аналогом Bourne Shell . В последствии, когда ее возможности выросли, тогда ее стали считать самостоятельным продуктом. Основными возможностями bash можно назвать следующие:
№ | Возможность | Комментарий |
---|---|---|
1 | Редактирование строки | Возможность отредактировать введенную команду вместо того чтобы переписывать ее заново |
2 | Организация каналов | Возможность перенаправления ввода-вывода , организации каналов между выполняемыми задачами |
3 | Удобство в работе | Использование псевдонимов команд, истории команд, автодополнения |
4 | Управление заданиями | Возможность создания фоновых заданий и управления ими |
5 | Гибкость настройки | Использование файлов-сценариев для входа для каждого пользователя отдельно, переменные среды |
С перенаправлением ввода-вывода и каналами мы познакомимся позднее, на 8-м занятии. Поэтому этот пункт мы опустим. А вот об особенностях работы в bash , о предоставляемых им преимуществах поговорим подробнее.
Bash автоматически записывает все команды, набранные пользователем в файл ~/.bash_history . Для управления этим файлом служит команда history. history - это встроенная команда bash . То есть, исполняемого файла, соответствующего этой команде не существует. Сама командная оболочка выполняет все действия. Введенная без параметров, она просто выводит список всех команд, сохраненных в этом файле и идентична команде cat ~/.bash_history .
История команд существует для упрощения набора часто используемых команд. Историю команд можно перебирать по списку клавишами <вверх> и <вниз> .
Другой способ – набрать в командной строке ! и начало команды и нажать
$ !/usr /usr/bin/perl ./ptest.pl OK $ !xfonts bash: !xfonts: event not found $
Но как ускорить ввод, если в истории еще нет необходимой нам команды? В этом случае нам поможет клавиша
3. С первого занятия вы должны были помнить, что Linux – многозадачная среда. Однако, до сих пор Вы еще так и не смогли воспользоваться его многозадачностью. На первый взгляд кажется, что консоль не позволяет использовать возможности многозадачности системы, и только в графической среде можно запустить одновременно две или более программы. Но это не так! Консоль тоже многозадачная.
Во-первых, вы можете открыть несколько консолей, открыв в каждой из них по
программе. Переключение между консолями будет производиться с помощью клавиш Ctrl+
И даже в одной консоли с помощью команд управления заданиями Вы можете в полной мере использовать все преимущества многозадачной системы.
команда & – символ & после команды позволяет запустить ее в фоновом режиме.
jobs – выводит список текущих заданий командного интерпретатора.
bg <#j>
– переводит задание #j
в фоновый режим
. Перед этим задание должно быть остановлено комбинацией клавиш
fg <#j>
– переводит задание #j
в режим выполнения на переднем плане. Задание должно быть остановлено комбинацией клавиш
$ man bash ^Z + Stopped man bash $ vim ^Z vim + Stopped vim $ bg 1 + man bash & $ jobs + Stopped man bash + Stopped vim $ fg 2 + vim $ fg + man bash $
4. Переменные среды – системная информация , указывающая Ваши предпочтения, такие как текстовый редактор по умолчанию, пути поиска исполняемых файлов и т.п., а также идентификационные данные пользователя, системы и командной оболочки, такие как имя пользователя , версия Linux и прочее, используемая командным интерпретатором и другими программами.
Часто используемые пользователем переменные это:
PATH – переменная содержит пути, в которых системе следует искать исполняемые файлы, если в командной строке не набирается полный или относительный путь к ним.
PWD – переменная содержит полное имя текущей директории.
HOME – переменная содержит полный путь домашнего каталога пользователя .
HOSTNAME – переменная содержит имя компьютера.
LOGNAME – содержит имя пользователя
SHELL – содержит имя командной оболочки, запущенной в текущем сеансе.
USER - содержит имя пользователя , сеанс которого открыт сейчас.
Список переменных, установленных в системе можно увидеть с помощью команды export , введенной без параметров.
Командный интерпретатор bash имеет и свои переменные. Чтобы локальные переменные стали системными их необходимо экспортировать с помощью все той же команды export .Например:
$ export declare -x HOME="/home/gserg" declare -x HOSTNAME="WebMedia" declare -x LANG="ru_RU.KOI8-R" declare -x LOGNAME="gserg" declare -x PATH="/bin:/usr/bin:/usr/local/bin:/home/gserg/bin" declare -x PWD="/home/gserg" declare -x SHELL="/bin/bash" declare -x TERM="Eterm" declare -x USER="gserg" $ EDITOR=/bin/vim $ export EDITOR $ export declare -x EDITOR="/bin/vim" declare -x HOME="/home/gserg" declare -x HOSTNAME="WebMedia" declare -x LANG="ru_RU.KOI8-R" declare -x LOGNAME="gserg" declare -x PATH="/bin:/usr/bin:/usr/local/bin:/home/gserg/bin:" declare -x PWD="/home/gserg" declare -x SHELL="/bin/bash" declare -x TERM="Eterm" declare -x USER="gserg" $
Команда unset удаляет системную переменную. Например:
$ unset EDITOR $ export declare -x HOME="/home/gserg" declare -x HOSTNAME="WebMedia" declare -x LANG="ru_RU.KOI8-R" declare -x LOGNAME="gserg" declare -x PATH="/bin:/usr/bin:/usr/local/bin:/home/gserg/bin:" declare -x PWD="/home/gserg" declare -x SHELL="/bin/bash" declare -x TERM="Eterm" declare -x USER="gserg" $
5. На сегодняшнем занятии мы познакомимся с вами с еще одной, немного нестандартной, командной оболочкой Midnight commander . Это не командная оболочка в обычном понимании. Это текстовый файловый менеджер – аналог Norton Commander или Far . Midnight commander запускается командой mc . Мы поговорим о его возможностях.
Экран Midnight commander"а разделен на две части. Практически все пространство экрана занимают две панели со списком каталогов и файлов. По умолчанию, вторая снизу экрана линия представляет собой командную строку, в которой Вы можете выполнять обычные команды оболочки, а на самой нижней линии изображены подсказки для функциональных клавиш (F1-F10 ). Верхняя линия символов содержит меню , с помощью которого возможно выполнение множества функций. Для использования меню Вы можете кликнуть мышью в необходимый пункт или нажать клавишу F9 и с помощью клавиш управления курсором выбрать нужный пункт .
Панели Midnight commander обеспечивают просмотр одновременно двух каталогов. Одна из панелей является активной (в том смысле, что пользователь может выполнять те или иные действия с находящимися в ней файлами и каталогами). В активной панели подсвечено имя одного из файлов или каталога, а также выделен цветом заголовок панели в верхней строке. Имя заголовка совпадает с названием каталога, отображаемого в данный момент. Почти все операции выполняются в активной панели. Некоторые операции , такие как перенос или копирование файлов используют пассивную панель в качестве места, куда производится копирование , перенос и т.д.
Теперь поговорим об основных сочетаниях клавиш, которые помогут Вам работать с Midnight commander"ом .
для смены активной панели применяются клавиши
для того, чтобы отметить файл
, нажмите
нажмите
с помощью
Клавиша
Клавиша <*> на дополнительной клавиатуре позволит инвертировать выделение файлов (она не действует на каталоги)
Клавиша <+> на дополнительной клавиатуре позволит отметить файлы по маске, а <-> снять отметку с файлов по маске.
Хотя сочетания быстрых клавиш являются оптимальным инструментом для того, чтобы сделать работу с Midnight commander"ом максимально быстрой и удобной, новичкам довольно тяжело выучить их сразу все. Чтобы восполнить этот пробел и добавить другие возможности, для которых отсутствуют комбинации клавиш, Midnight commander имеет меню (вызываемое по F9 ).
Меню состоит из пунктов: "Левая панель", "Файл", "Команда", "Настройки", "Правая панель" .
"Левая/правая панель" - эти пункты меню совершенно одинаковые. Различия между ними заключаются только в том, что выполняемые действия будут адресованы в левую или правую панель.
"Формат списка" - открывает диалоговое окно , в котором можно выбрать вид, в котором будет отображаться список файлов/каталогов. На выбор предлагается стандартный, укороченный и расширенный форматы. Однако пользователь в этом окне может и сам определить вид панели таким, какой его будет устраивать, выбрав переключателем "Определенный пользователем".
"Быстрый просмотр" - переводит панель в режим автоматического просмотра файлов, выбираемых на соседней панели. Фокус автоматически переключается на противоположную панель.
"Информация" - переводит панель в режим просмотра информации о файле, подсвеченном в соседней панели, такой как положение, права доступа и владелец, файловая система и устройство, на котором он расположен, количестве жестких ссылок, связанных с этим файлом, а также информации об устройстве, на котором расположен файл ,
"Дерево" - переводит Midnight commander в режим, похожий на режим работы Проводника из OC Windows . В панели, к которой применена команда "Дерево" , строится дерево каталогов, по которому можно перемещаться с помощью стрелок управления курсором , клавиш PageUp, PageDown, Home, End . В соседней панели высвечивается содержимое каталога, подсвеченного в дереве.
"Порядок сортировки" - открывает диалоговое окно , в котором вы можете выбрать атрибут , по которому будет производиться сортировка файлов и каталогов в списке из таких как имя, расширение, время правки, время доступа , время изменения атрибутов, размер, узел (на котором расположен файл ). Также можно оставить файлы без сортировки, сортировать с учетом регистра или в обратном порядке.
"Фильтр" - позволяет выбрать имена файлов, которые будут отображаться в панели с помощью регулярного выражения, введенного в диалоговом окне.
"FTP-соединение" - с помощью этой команды Вы можете установить соединение с удаленным (или даже локальным) компьютером по протоколу ftp . Если введен только адрес удаленного сервера, то Midnight commander попытается установить анонимное соединение. Полная же строка, с помощью которой задается узел такова:
ftp:имя_пользователя:пароль@адрес_сервера:порт/каталог_на_сервере
После установки соединения, работа с удаленной файловой системой происходит аналогично работе с локальной ФС.
"Shell-соединение" - позволяет открыть сетевое соединение по протоколу FISH (FIle transfer over SHell – передача файлов посредством оболочки). FISH использует протоколы RSH (Remote SHell – удаленная оболочка ) или SSH (Secure SHell – защищенная оболочка , аналог RSH , но с поддержкой шифрования передаваемых данных). Полная строка, с помощью которой пользователь может задать удаленный узел такова:
sh:имя_пользователя@адрес_сервера:опции/каталог_на_сервере
Параметр имя_пользователя , опции и каталог_на_сервере не обязательны. Если имя пользователя не указано, то Midnight commander будет пытаться зарегистрироваться на удаленной системе с именем пользователя, используемым на локальном компьютере.
"Пересмотреть"
- аналог комбинации клавиш
"Файл" - раздел меню , пункты которого обеспечивают основные функции обработки файлов и каталогов, такие как:
"Меню пользователя"
- позволяет вызвать меню
, которое устанавливает сам пользователь
. Также вызывается клавишей
"Просмотр файла"
- аналог функции, выполняемой по
нажатию
"Просмотр файла..." - то же, что и предыдущий пункт , но действует не на подсвеченный файл , а на тот, имя и путь к которому будет введен в диалоговом окне.
"Просмотр команды" - позволяет выполнить команду и просмотреть ее стандартный вывод в режиме просмотра файла.
"Редактирование" - открывает файл для правки. Простой встроенный текстовый редактор имеет достаточный набор встроенных функций для редактирования файлов конфигурации, исходных текстов программ и т.д., а встроенная автоматическая подсветка синтаксиса делает редактирование более удобным, а редактируемые тексты более удобочитаемыми.
"Копирование"
- копирует файл
из активной панели в пассивную. Аналог функции, вызываемой по
"Права доступа" - позволяет изменить права доступа к файлу (или группе файлов) в диалоговом окне.
"Символич. ссылка" - создает символическую ссылку. По умолчанию за адресуемый принимается файл , подсвеченный в активной панели, а создаваемая ссылка будет иметь то же имя и располагаться в каталоге, открытом в пассивной панели. Пользователь может изменить это в открывающемся диалоговом окне.
"Владелец/группа" - изменяет владельца и/или группу, к которой принадлежит файл /каталог.
"Права (расширенные)" - позволяет изменять одновременно права доступа к файлу и его владельца и/или группу. Права доступа представлены в виде трех последовательностей rwx для владельца, группы и всех пользователей.
"Переименование"
- позволяет переименовать/переместить файл
. Аналог функции, вызываемой по
"Создание каталога"
- создает каталог. Аналог функции, вызываемой по
"Удаление"
- удаляет файл
/группу файлов/каталог. Аналог функции, вызываемой по
"Смена каталога" - меняет текущий каталог . Аналогична команде cd командного интерпретатора Bash . Необходимый каталог вводится в диалоговом окне.
"Отметить группу" - Отмечает группу файлов по маске в каталоге, открытом в активной панели. Аналог функции, вызываемой с помощью <+> на дополнительной клавиатуре.
Командный язык shell (в переводе - раковина, скорлупа) фактически есть язык программирования очень высокого уровня. На этом языке пользователь осуществляет управление компьютером. Обычно, после входа в систему вы начинаете взаимодействовать с командной оболочкой. Признаком того, что оболочка (shell) готова к приему команд служит выдаваемый ею на экран промптер. В простейшем случае это один доллар ("$"). Shell не является необходимым и единственным командным языком (хотя именно он стандартизован в рамках POSIX - стандарта мобильных систем). Например, немалой популярностью пользуется язык cshell, есть также kshell, bashell и другие. Более того, каждый пользователь может создать свой командный язык. Может одновременно на одном экземпляре операционной системы работать с разными командными языками. shell - это одна из многих команд UNIX. То есть в набор команд оболочки "shell" входит команда "sh" - вызов интерпретатора "shell". Первый "shell" вызывается автоматически при вашем входе в систему и выдает на экран промтер. После этого вы можете вызывать на выполнение любые команды, в том числе и снова сам "shell", который вам создаст новую оболочку внутри прежней. Так например, если вы подготовите в редакторе файл "file_1":
Echo Hello!
то это будет обычный текстовый файл, содержащий команду "echo", которая при выполнении выдает все написанное правее ее на экран. Можно сделать файл "file_1" выполняемым с помощью команды "chmod 755 file_1". Но его можно выполнить, вызвав явно команду "sh" ("shell"):
Sh file_1
Sh < file1
Файл можно выполнить и в текущем экземпляре "shell". Для этого существует специфическая команда "." (точка), т.е.
File_1
Поскольку UNIX - система многопользовательская, вы можете даже на персональном компьютере работать параллельно, скажем, на 12-ти экранах (переход с экрана на экран ALT/функциональная клавиша), имея на каждом экране нового (или одного и того же) пользователя со своей командной оболочкой. Можете и в графическом режиме X-Window также открыть большое число окон, а в каждом окне может быть свой пользователь со своей командной оболочкой... Стержневым элементом языка shell является команда.
Структуры команд:
Команды в shell обычно имеют следующий формат:
<имя команды> <флаги> <аргумент(ы)>
Например:
Ls -ls /usr/bin
Где ls - имя команды выдачи содержимого директория, -ls - флаги ("-" - признак флагов, l - длинный формат, s - об"ем файлов в блоках), /usr/bin - директорий, для которого выполняется команда. Эта команда выдаст на экран в длинном формате содержимое директория /usr/bin, при этом добавит информацию о размере каждого файла в блоках. К сожалению, такая структура команды выдерживается далеко не всегда. Не всегда перед флагами ставится минус, не всегда флаги идут одним словом. Есть разнообразие и в представлении аргументов. К числу команд, имеющих экзотические форматы, относятся и такие "ходовые" команды, как сс - вызов компилятора языка С, tar - работа с архивами, dd - копирование файла с преобразованием, find - поиск файлов и ряд других. Как правило, первое слово shell воспринимает, как команду. Поэтому в командной строке
первое слово будет расшифровано shell, как команда (конкатенации), которая выдаст на экран файл с именем "cat" (второе слово), находящийся в текущем директории. Перенаправление команд Стандартный ввод (вход) - "stdin" в ОС UNIX осуществляется с клавиатуры терминала, а стандартный вывод (выход) - "stdout" направлен на экран терминала. Существует еще и стандартный файл диагностических сообщений - "stderr", о котором речь будет чуть позже. Команда, которая может работать со стандартным входом и выходом, называется ФИЛЬТРОМ. Пользователь имеет удобные средства перенаправления ввода и вывода на другие файлы (устройства). Символы ">" и ">>" обозначают перенаправление вывода. ls >file_1 команда "ls" сформирует список файлов текущего каталога и поместит его в файл "file_1" (вместо выдачи на экран). Если файл "file_1" до этого существовал, то он будет затерт новым.
Pwd >>file_1
команда pwd сформирует полное имя текущего каталога и поместит его в конец файла "file_1", т.е. ">>" добавляет в файл, если он непустой. Символы "<" и "<<" обозначают перенаправление ввода.
Wc -l подсчитает и выдаст на экран число строк в файле file_1. Ed file_2 < создаст с использованием редактора файл "file_2", непосредственно с терминала. Окончание ввода определяется по символу, стоящему правее "<<" (т. е. "!"). То есть ввод будет закончен, когда первым в очередной строке будет "!".
Можно сочетать перенаправления. Так Wc -l Wc -l >file_4 выполняются одинаково: подсчитывается число строк файла "file_3" и результат помещается в файл "file_4".
Средство, объединяющее стандартный выход одной команды со стандартным входом другой, называется КОНВЕЙЕРОМ и обозначается вертикальной чертой "|". Ls | wc -l
список файлов текущего каталога будет направлен на вход команды "wc", которая на экран выведет число строк каталога.
Конвейером можно объединять и более двух команд, когда все они, возможно кроме первой и последней - фильтры: Cat file_1 | grep -h result | sort | cat -b > file_2
Данный конвейер из файла "file_1" ("cat") выберет все строки, содержащие слово "result" ("grep"), отсортирует ("sort") полученные строки, а затем пронумерует ("cat -b") и выведет результат в файл "file_2".
Поскольку устройства в ОС UNIX представлены специальными файлами, их можно использовать при перенаправлениях. Специальные файлы находятся в каталоге "/dev". Например, "lp" - печать; "console" - консоль; "ttyi" - i-ый терминал; "null" - фиктивный (пустой) файл (устройство).
Тогда, например, Ls > /dev/lp
выведет содержимое текущего каталога на печать, а
file_1 < /dev/null
обнулит файл "file_1". Sort file_1 | tee /dev/lp | tail -20
В этом случае будет отсортирован файл "file_1" и передан на печать, а 20 последних строк также будут выданы на экран.
Вернемся к перенаправлению выхода. Стандартные файлы имеют номера: 0 - stdin,
1 - stdout
2 - stderr.
Если вам не желательно иметь на экране сообщение об ошибке, вы можете перенаправить его с экрана в указанный вами файл (или вообще "выбросить", перенаправив в файл "пустого устройства" - /dev/null). Например при выполнении команды Cat file_1 file_2
которая должна выдать на экран последовательно содержимое файлов "file_1" и "file_2", выдаст вам, например, следующее 111111 222222
cat: f2: No such file or directory
где 111111 222222 - содержимое файла "file_1", а файл "file_2" отсутствует, о чем команда "cat" выдала сообщение в стандартный файл диагностики, по умолчанию, как и стандартный выход, представленный экраном.
Если вам не желательно такое сообщение на экране, его можно перенаправить в указанный вами файл: Cat file_1 file_2 2>f-err
сообщения об ошибках будут направляться (об этом говорит перенаправление "2>") в файл "f-err". Кстати, вы можете всю информацию направлять в один файл "ff", использовав в данном случае конструкцию Cat file_1 file_2 >>ff 2>ff
Можно указать не только какой из стандартных файлов перенаправлять, но и в какой стандартный файл осуществить перенаправление. Cat file_1 file_2 2>>ff 1>&2
Здесь сначала "stderr" перенаправляется (в режиме добавления) в файл "ff", а затем стандартный выход перенаправляется на "stderr", которым к этому моменту является файл "ff". То есть результат будет аналогичен предыдущему.
Конструкция "1>&2" - означает, что кроме номера стандартного файла, в который перенаправить, необходимо впереди ставить "&"; вся конструкция пишется без пробелов.
<-
закрывает стандартный ввод.
>- закрывает стандартный вывод.
Командные файлы.
Для того, чтобы текстовый файл можно было использовать как команду, существует несколько возможностей.
Пусть с помощью редактора создан файл с именем "cmd", содержащий одну строку следующего вида: Date; pwd; ls
Можно вызвать shell как команду, обозначаемую "sh", и передать ей файл "cmd", как аргумент или как перенаправленный вход, т.е.
$ sh cmd
$ sh В результате выполнения любой из этих команд будет выдана дата, затем имя текущего каталога, а потом содержимое каталога.
Более интересный и удобный вариант работы с командным файлом - это превратить его в выполняемый, т.е. просто сделать его командой, что достигается изменением кода защиты. Для этого надо разрешить выполнение этого файла.
Например, Chmod 711 cmd
сделает код защиты "rwx__x__x". Тогда простой вызов приведет к выполнению тех же трех команд.
Результат будет тот же, если файл с содержимым Date; pwd; ls
представлен в виде:
date
pwd
ls
так как переход на другую строку также является разделителем в последовательности команд.
Таким образом, выполняемыми файлами могут быть не только файлы, полученные в результате компиляции и сборки, но и файлы, написанные на языке shell. Их выполнение происходит в режиме интерпретации с помощью shell-интерпретатора Отладка командных файлов
В SHELL используются два механизма отладки командных файлов.
Первый из них: set -v выводит строки командного файла по мере их чтения. Этот режим применяется при поиске синтаксических ошибок. Для его использования не требуется производить модификацию командного файла, например:
sh -v proc... здесь proc - имя командного файла. Ключ -v может использоваться вместе с ключом -n, предотвращающим выполнение следующих за ним команд (команда set -n блокирует терминал до тех пор, пока не вводится признак конца файла EOF). Команда set -х выводит команды по мере их выполнения, причём на терминал выводятся строки программы и на место переменных подставляются их значения. Для отмены ключей -x и -v можно воспользоваться командой set - а для установки - присвоить соответствующее значение макропеременной.
СРЕДА SHELL (ПЕРЕМЕННЫЕ И ПАРАМЕТРЫ)
На языке shell можно писать командные файлы и с помощью команды "chmod" делать их выполняемыми. После этого они ни чем не отличаются от прочих команд ОС UNIX. Shell-переменные
Имя shell-переменной - это начинающаяся с буквы последовательность букв, цифр и подчеркиваний.
Значение shell-переменной - строка символов.
То, что в shell всего два типа данных: строка символов и текстовый файл, с одной стороны, позволяет легко вовлекать в программирование конечных пользователей, никогда ранее программированием не занимавшихся, а с другой стороны, вызывает некий внутренний протест у многих программистов, привыкших к существенно большему разнообразию и большей гибкости языковых средств.
Однако интересно наблюдать то, как высококлассные программисты, освоившись с "правилами игры" shell, пишут на нем программы во много раз быстрее, чем на Си, но, что особенно интересно, в ряде случаев эти программы работают даже быстрее, чем реализованные на Си.
Имя переменной аналогично традиционному представлению об идентификаторе, т.е. именем может быть последовательность букв, цифр и подчеркиваний, начинающаяся с буквы или подчеркивания.
Для присваивания значений переменным может использоваться оператор присваивания "=". Var_1=13 - "13" - это не число, а строка из двух цифр.
var_2="ОС UNIX" - здесь двойные кавычки (" ") необходимы, так как в строке есть пробел.
Возможны и иные способы присваивания значений shell-переменным. Так например запись, DAT=`date`
приводит к тому, что сначала выполняется команда "date" (обратные кавычки говорят о том, что сначала должна быть выполнена заключенная в них команда), а результат ее выполнения, вместо выдачи на стандартный выход, приписывается в качестве значения переменной, в данном случае "DAT".
Можно присвоить значение переменной и с помощью команды "read", которая обеспечивает прием значения переменной с (клавиатуры) дисплея в диалоговом режиме. Обычно команде "read" в командном файле предшествует команда "echo", которая позволяет предварительно выдать какое-то сообщение на экран. Например: Echo -n "Введите трехзначное число:"
read x
При выполнении этого фрагмента командного файла, после вывода на экран сообщения Введите трехзначное число:
интерпретатор остановится и будет ждать ввода значения с клавиатуры. Если вы ввели, скажем, "753" то это и станет значением переменной "x".
Одна команда "read" может прочитать (присвоить) значения сразу для нескольких переменных. Если переменных в "read" больше, чем их введено (через пробелы), оставшимся присваивается пустая строка. Если передаваемых значений больше, чем переменных в команде "read", то лишние игнорируются.
При обращении к shell-переменной необходимо перед именем ставить символ "$". Так команды
echo $var_2
echo var_2
выдадут на экран ОС UNIX
var_2
Экранирование
Рассмотрим более подробно приемы экранирования, используемые в shell. В качестве средств экранирования используются двойные кавычки (" "), одинарные кавычки (" ") и бэк-слэш (\).
Из примеров очевидно их действие:
Можно в одной строке записывать несколько приcваиваний. X=22 y=33 z=$x
A="$x" B="$x" C=\$x
D="$x + $y + $z" E="$x + $y + $z" F=$x\ +\ $y\ +\ $z
(присваивание G=$x+$y не было бы выполнено из-за пробелов)
Тогда Echo A = $A B = $B C = $C
echo D = $D E = $E F = $F
eval echo evaluated A = $A
eval echo evaluated B = $B
eval echo evaluated C = $C
Выдадут на экран A = 22 B = $x C = $x
D = 22 + 33 + 22 E = $x + $y + $z F = 22 + 33 + 22
evaluated A = 22
evaluated B = 22
evaluated C = 22
Приведем еще примеры, связанные с экранированием перевода строки. Пусть переменной "string" присвоено значение "массива" 2x3:
abc
def
Обратим внимание, что для избежания присваивания лишних пробелов вторая строка массива начата с первой позиции следующей строки:
string="abc
def"
Тогда три варианта записи переменной в команде "echo"
echo $string
echo "$string"
echo "$string"
дадут соответственно три различных результата:
abc def
$string
abc
def
а последовательность команд
echo "str_1
str_2" > file_1
echo "str_1
str_2" > file_2
cat file_1 file_2
даст выдаст последовательно одинаковые файлы file_1 и file_2:
str_1
str_2
str_1
str_2
Заметим также, что бэк-слэш (\) не только экранирует следующий за ним символ, что позволяет использовать специальные символы просто как символы, представляющие сами себя (он может экранировать и сам себя - \\), но в командном файле бэк-слэш позволяет об"единять строки в одну (экранировать конец строки).
Например, приводившийся ранее пример командной строки: Cat file_1 | grep -h result | sort | cat -b > file_2
может быть записан в командном файле, скажем, как Cat file_1 | grep -h \
result | sort | cat -b > file_2
Кстати, эффект продолжения командной строки обеспечивает и символ конвейера. В данном случае это может дать более симпатичный результат, например: Cat file_1 |
grep -h result |
sort |
cat -b > file_2
Манипуляции с shell-переменными
Несмотря на то, что shell-переменные в общем случае воспринимаются как строки, т. е. "35" - это не число, а строка из двух символов "3" и "5", в раде случаев они могут интерпретироваться иначе, например, как целые числа.
Разнообразные возможности имеет команда "expr".
Проиллюстрируем некоторые на примерах:
Выполнение командного файла: X=7 y=2
a=`expr $x + $y` ; echo a=$a
a=`expr $a + 1` ; echo a=$a
b=`expr $y - $x` ; echo b=$b
c=`expr $x "*" $y` ; echo c=$c
d=`expr $x / $y` ; echo d=$d
e=`expr $x % $y` ; echo e=$e
выдаст на экран A=9
a=10
b=-5
c=14
d=3
e=1
Операция умножения ("*") обязательно должна быть заэкранирована, поскольку в shell этот значок воспринимается, как спецсимвол, означающий, что на это место может быть подставлена любая последовательность символов.
С командой "expr" возможны не только (целочисленные) арифметические операции, но и строковые: A=`expr "cocktail" : "cock"` ; echo $A
B=`expr "cocktail" : "tail"` ; echo $B
C=`expr "cocktail" : "cook"` ; echo $C
D=`expr "cock" : "cocktail"` ; echo $D
На экран будут выведены числа, показывающее число совпадающих символов в цепочках (от начала). Вторая из строк не может быть длиннее первой: 4
0
0
0
Экспорт переменных
В ОС UNIX существует понятие процесса. Процесс возникает тогда, когда запускается на выполнение какая-либо команда.
Например, при наборе на клавиатуре "р Параметры
В командный файл могут быть переданы параметры. В shell используются позиционные параметры (т.е. существенна очередность их следования). В командном файле соответствующие параметрам переменные (аналогично shell-переменным) начинаются с символа "$", а далее следует одна из цифр от 0 до 9:
Пусть "examp-1" вызывается с параметрами "cock" и "tail". Эти параметры попадают в новую среду под стандартными именами "1" и "2". В (стандартной) переменной с именем "0" будет храниться имя вызванного расчета.
При обращении к параметрам перед цифрой ставится символ доллара "$" (как и при обращении к переменным):
$0
соответствует имени данного командного файла;
$1 первый по порядку параметр;
$2 второй параметр и т.д.
Поскольку число переменных, в которые могут передаваться параметры, ограничено одной цифрой, т.е. 9-ю ("0", как уже отмечалось имеет особый смысл), то для передачи большего числа параметров используется специальная команда "shift".
Своеобразный подход к параметрам дает команда "set".
Например, фрагмент Set a b с
echo первый=$1 второй=$2 третий=$3
выдаст на экран Первый=a второй=b третий=c
т.е. команда "set" устанавливает значения параметров. Это бывает очень удобно. Например, команда "date" выдает на экран текущую дату, скажем, "Mon May 01 12:15:10 2000", состоящую из пяти слов, тогда Set `date`
echo $1 $3 $5
выдаст на экран Mon 01 2000
Команда "set" позволяет также осуществлять контроль выполнения программы, например:
set -v
на терминал выводятся строки, читаемые shell.
set +v отменяет предыдущий режим.
set -x на терминал выводятся команды перед выполнением.
set +x отменяет предыдущий режим.
Команда "set" без параметров выводит на терминал состояние программной среды. Подстановки shell-интерпретатора
Перед началом непосредственной интерпретации и выполнением команд, содержащихся в командных файлах, shell выполняет различные виды подстановок:
1. ПОДСТАНОВКА РЕЗУЛЬТАТОВ. Выполняются все команды, заключенные в обратные кавычки, и на их место подставляется результат.
2. ПОДСТАНОВКА ЗНАЧЕНИЙ ПАРАМЕТРОВ И ПЕРЕМЕННЫХ. То есть слова, начинающиеся на "$", заменяются соответствующими значениями переменных и параметров.
3. ИНТЕРПРЕТАЦИЯ ПРОБЕЛОВ. Заэкранированные пробелы игнорируются.
4. ГЕНЕРАЦИЯ ИМЕН ФАЙЛОВ. Проверяются слова на наличие в них спецсимволов ("*", "?","") и выполняются соответствующие генерации.
Программная среда
Каждый процесс имеет среду, в которой он выполняется. Shell использует ряд переменных этой среды.
Если вы наберете команду "set" без параметров, то на экран будет выдана информация о ряде стандартных переменных, созданных при входе в систему (и передаваемых далее всем вашим новым процессам "по наследству"), а также переменных, созданных и экспортируемых вашими процессами.
Конкретный вид и содержание выдаваемой информации в немалой степени зависит от того, какая версия UNIX используется и как инсталлирована система. Результат выполнения команды set без параметров (не полный): HOME=/root
PATH=/usr/local/bin:/usr/bin:/bin:.:/usr/bin/X11:
IFS=
LOGNAME=sae
MAIL=/var/spool/mail/sae
PWD=/home/sae/STUDY/SHELL
PS1=${PWD}:" "
PS2=>
SHELL=/bin/bash
Прокомментируем значения переменных.
HOME=/root - это имя домашнего директория, в котором пользователь оказывается после входа в систему. То есть, правильно набрав имя и пароль, я окажусь в директории "/root".
PATH=/bin:/usr/bin:.:/usr/local/bin:/usr/bin/X11 - эта переменная задает последовательность файлов, которые просматривает "shell" в поисках команды. Имена файлов разделяются здесь двоеточиями. Последовательность просмотра соответствует очередности следования имен в тропе. Но первоначально поиск происходит среди так называемых встроенных команд. В число встроенных команд входят наиболее часто используемые команды, например "echo", "cd", "pwd", "date". После этого система просматривает директорий "/bin", в котором могут находиться команды "sh", "cp", "mv", "ls" и т.п. Затем директорий "/usr/bin" с командами "cat", "сс", "expr", "nroff", "man" и многими другими. Далее поиск происходит в текущем директории (".", или другое обозначение "пусто", т.е.""), где скорее всего находятся написанные вами команды.
После набора командной строки и нажатия @ перечень параметров, как совокупность слов;
- флаги, передаваемые в shell.
При обращении к этим переменным (т.е при использовании их в командном файле - shell-программе) следует впереди ставить "$".
Важную роль при создании уникальных файлов играет специальная переменная "$$", значение которой соответствует номеру процесса, выполняющего данный расчет. Каждый новый расчет, выполняемый компьютером, инициирует один или несколько процессов, автоматически получающих номера по порядку. Поэтому, используя номер процесса в качестве имени файла, можно быть уверенным, что каждый новый файл будет иметь новое имя (не запишется на место уже существующего). Достоинство является и главным недостатком такого способа именования файлов. Неизвестно, какие имена будут присвоены файлам. И, если в рамках данного процесса можно найти файл "не глядя", т.е., обратившись к нему, используя $$, то потом такие файлы можно легко потерять. Это создает дополнительные проблемы при отладке программ.
Вызов интерпритатора
Вслед за регистрацией пользователя в системе (с помощью команды login) вызывается интерпретатор языка SHELL. Если регистрационный справочник пользователя содержит файл.profile, то прежде чем с терминала будет принята хотя бы одна команда, интерпретатор выполняет этот файл (подразумевается, что файл.profile содержит команды). При вызове могут указываться следующие ключи:
-c строка
Команды считываются из заданной строки.
-s
Команды читаются из стандартного файла ввода. Сообщения интерпретатора записываются в стандартный файл диагностик.
-i
Интерактивный режим работы.
Если первым символом параметра "0" является знак -, то команды считываются из файла.profile. ПРОГРАММНЫЕ СТРУКТУРЫ===
Как во всяком языке программирования в тексте на языке shell могут быть комментарии. Для этого используется символ "#". Все, что находится в строке (в командном файле) левее этого символа, воспринимается интерпретатором как комментарий. Например,
# Это комментарий.
Как во всяком процедурном языке программирования в языке shell есть операторы. Ряд операторов позволяет управлять последовательностью выполнения команд. В таких операторах часто необходима проверка условия, которая и определяет направление продолжения вычислений. Команда test ("")
Команда test проверяет выполнение некоторого условия. С использованием этой (встроенной) команды формируются операторы выбора и цикла языка shell.
Два возможных формата команды: Test условие
[ условие ]
мы будем пользоваться вторым вариантом, т.е. вместо того, чтобы писать перед условием слово "test", будем заключать условие в скобки, что более привычно для программистов.
На самом деле shell будет распознавать эту команду по открывающей скобке "[", как слову, соответствующему команде "test". Между скобками и содержащимся в них условием обязательно должны быть пробелы.
Пробелы должны быть и между значениями и символом сравнения или операции
В shell используются условия различных "типов".
УСЛОВИЯ ПРОВЕРКИ ФАЙЛОВ:
-f file
файл "file" является обычным файлом;
-d file файл "file" - каталог;
-с file файл "file" - специальный файл;
-r file имеется разрешение на чтение файла "file";
-w file имеется разрешение на запись в файл "file";
-s file файл "file" не пустой. УСЛОВИЯ ПРОВЕРКИ СТРОК:
str1 = str2
строки "str1" и "str2" совпадают;
str1 != str2 строки "str1" и "str2" не совпадают;
-n str1 строка "str1" существует (непустая);
-z str1 строка "str1" не существует (пустая).
Примеры. X="who is who"; export x; [ "who is who" = "$x" ]; echo $?
0
x=abc ; export x ; [ abc = "$x" ] ; echo $?
0
x=abc ; export x ; [ -n "$x" ] ; echo $?
0
x="" ; export x ; [ -n "$x" ] ; echo $?
1
Кроме того, существуют два стандартных значения условия, которые могут использоваться вместо условия (для этого не нужны скобки).
УСЛОВИЯ СРАВНЕНИЯ ЦЕЛЫХ ЧИСЕЛ:
x -eq y
"x" равно "y",
x -ne y "x" неравно "y",
x -gt y "x" больше "y",
x -ge y "x" больше или равно "y",
x -lt y "x" меньше "y",
x -le y "x" меньше или равно "y".
СЛОЖНЫЕ УСЛОВИЯ:
Реализуются с помощью типовых логических операций:
!
(not) инвертирует значение кода завершения.
-o (or) соответствует логическому "ИЛИ".
-a (and) соответствует логическому "И". Условный оператор "if"
В общем случае оператор "if" имеет структуру If условие
then список
Здесь "elif" сокращенный вариант от "else if" может быть использован наряду с полным, т.е. допускается вложение произвольного числа операторов "if" (как и других операторов). Разумеется "список" в каждом случае должен быть осмысленный и допустимый в данном контексте.
Самая усеченная структура этого оператора If условие
then список
fi
если выполнено условие (как правило это ком получен код завершения "0", то выполняется "список", иначе он пропускается.
Примеры.
Пусть написан "if-1" If [ $1 -gt $2 ]
then pwd
else echo $0: Hello! Тогда вызов if-1 12 11 даст /home/sae/STUDY/SHELL
а if-1 12 13 даст if-1: Hello! Оператор вызова ("case")
Оператор выбора "case" имеет структуру: Case строка in
шаблон) список команд;;
шаблон) список команд;;
...
шаблон) список команд;; Здесь "case" "in" и "esac" - служебные слова. "Строка" (это может быть и один символ) сравнивается с "шаблоном". Затем выполняется "список команд" выбранной строки.
Непривычно выглядят в конце строк выбора ";;", но написать здесь ";" было бы ошибкой. Для каждой альтернативы может быть выполнено несколько команд. Если эти команды будут записаны в одну строку, то символ ";" будет использоваться как разделитель команд.
Обычно последняя строка выбора имеет шаблон "*", что в структуре "case" означает "любое значение". Эта строка выбирается, если не произошло совпадение значения переменной (здесь $z) ни с одним из ранее записанных шаблонов, ограниченных скобкой ")". Значения просматриваются в порядке записи. Оператор цикла с перечислением ("for")
Оператор цикла "for" имеет структуру: For имя
do
список команд
done
где "for" - служебное слово определяющее тип цикла,
"do" и "done" - служебные слова, выделяющие тело цикла.
Пусть команда "lsort" представлена командным файлом For i in file_1 file_2 file_3
do
proc_sort $i
done
В этом примере имя "i" играет роль параметра цикла. Это имя можно рассматривать как shell-переменную, которой последовательно присваиваются перечисленные значения (i=file_1, i=file_2, i=file_3), и выполняется в цикле команда "proc_sort".
Часто используется форма "for i in *", означающая "для всех файлов текущего каталога".
Пусть "proc_sort" в свою очередь представляется командным файлом Cat $1 | sort | tee /dev/lp > ${1}_sorted
т.е. последовательно сортируются указанные файлы, результаты сортировки выводятся на печать ("/dev/lp") и направляются в файлы file_1_sorted file_2_sorted и file_3_sorted Оператор цикла с истинным условием ("while")
Структура "while", также обеспечивающая выполнение расчетов, предпочтительнее тогда, когда неизвестен заранее точный список значений параметров или этот список должен быть получен в результате вычислений в цикле.
Оператор цикла "while" имеет структуру: While условие
do
список команд
done
где "while" - служебное слово определяющее тип цикла с истинным условием. Список команд в теле цикла (между "do" и "done") повторяется до тех пор, пока сохраняется истинность условия (т.е. код завершения последней команды в теле цикла равен "0") или цикл не будет прерван изнутри специальными командами ("break", "continue" или "exit"). При первом входе в цикл условие должно выполняться.
Команда "break [n]" позволяет выходить из цикла. Если "n" отсутствует, то это эквивалентно "break 1". "n" указывает число вложенных циклов, из которых надо выйти, например, "break 3" - выход из трех вложенных циклов.
В отличие от команды "break" команда "continue [n]" лишь прекращает выполнение текущего цикла и возвращает на НАЧАЛО цикла. Она также может быть с параметром. Например, "continue 2" означает выход на начало второго (если считать из глубины) вложенного цикла.
Команда "exit [n]" позволяет выйти вообще из процедуры с кодом возврата "0" или "n" (если параметр "n" указан). Эта команда может использоваться не только в циклах. Даже в линейной последовательности команд она может быть полезна при отладке, чтобы прекратит выполнение (текущего) расчета в заданной точке. Оператор цикла с ложным условием ("until")
Оператор цикла "until" имеет структуру: Until условие
do
список команд
done
где "until" - служебное слово определяющее тип цикла с ложным условием. Список команд в теле цикла (между "do" и "done") повторяется до тех пор, пока сохраняется ложность условия или цикл не будет прерван изнутри специальными командами ("break", "continue" или "exit"). При первом входе в цикл условие не должно выполняться.
Отличие от оператора "while" состоит в том, что условие цикла проверяется на ложность (на ненулевой код завершения последней команды тела цикла) проверяется ПОСЛЕ каждого (в том числе и первого!) выполнения команд тела цикла.
Пример. Until false
do
read x
if [ $x = 5 ]
then echo enough ; break
else echo some more
fi Здесь программа с бесконечным циклом ждет ввода слов (повторяя на экране фразу "some more"), пока не будет введено "5". После этого выдается "enough" и команда "break" прекращает выполнение цикла. Пустой оператор
Пустой оператор имеет формат Ничего не делает. Возвращает значение "0".". Функции в shell
Функция позволяет подготовить список команд shell для последующего выполнения.
Описание функции имеет вид: Имя()
{
список команд
}
после чего обращение к функции происходит по имени. При выполнении функции не создается нового процесса. Она выполняется в среде соответствующего процесса. Аргументы функции становятся ее позиционными параметрами; имя функции - ее нулевой параметр. Прервать выполнение функции можно оператором "return [n]", где (необязательное) "n" - код возврата. Обработка прерываний ("trap")
Бывает необходимо защитить выполнение программы от прерывания.
Наиболее часто приходится встречаться со следующими прерываниями, соответствующими сигналам:
0
выход из интерпретатора,
1 отбой (отключение удаленного абонента),
2 прерывание от Trap "список команд" сигналы
Если в системе возникнут прерывания, чьи сигналы перечислены через пробел в "сигналы", то будет выполнен "список команд", после чего (если в списке команд не была выполнена команда "exit") управление вернется в точку прерывания и продолжится выполнение командного файла.
Например, если перед прекращением по прерываниям выполнения какого то командного файла необходимо удалить файлы в "/tmp", то это может быть выполнено командой "trap": Trap "rm /tmp/* ; exit 1" 1 2 15
которая предшествует прочим командам файла. Здесь, после удаления файлов будет осуществлен выход "exit" из командного файла. Наверняка почти все читатели Хабра знают оболочки sh и bash. Так же большинство из нас что-то слышали про zsh и tcsh. Однако на этом список существующих оболочек не заканчивается. Условно можно разделить их на три группы: Наибольшее распространение получили POSIX-совместимые оболочки, ведущие родословную от Bourne shell (шелл Борна), поэтому с него и начнем Bourne shell
, исполняемый файл: sh
. Командная оболочка названная в честь своего создателя Стивена Борна. Большая часть операторов была заимствована им из языка Алгол 68. Вышла в 7-м издании операционной системы UNIX, где была оболочкой по умолчанию. До сих пор подавляющее большинство Unix-подобных систем имеют /bin/sh - символическую или жесткую ссылку на sh-совместимую оболочку. Bourne again shell
, исполняемый файл: bash
. Название можно перевести, как «Возрождённый шел Борна». Скорее всего самая популярная оболочка на сегодняшний день. Де-факто стандарт для Linux. Не буду на ней останавливаться, т.к. в интернете много хороших статей про bash. Например вот и вот . Z shell
, исполняемый файл: zsh
. Свободная современная sh-совместимая оболочка. Имеет ряд преимуществ перед bash касающихся в основном работы в интерактивном режиме. О ней на Хабре писали и C shell
, исполняемый файл: csh
Командная оболочка разработанная автором vi Биллом Джоем . За основу для скриптового языка csh был взят, как понятно из названия, язык C. Т.к. на тот момент, в 1978 г., это был наиболее популярный язык программирования среди разработчиков и пользователей BSD UNIX. В настоящий момент более популярна свободная реализация csh - tcsh. TENEX C Shell
, исполняемый файл: tcsh
. Именно в tcsh когда-то впервые появилось автодополнение. Является оболочкой по умолчанию в FreeBSD. Подробнее о ней почитать можно . Условная конструкция: Цикл вычисляющий 10 первых степеней двойки: Однако список фичь поддерживаемых свежими версиями bash, zsh и tcsh очень похож и выбор конкретной оболочки по большей части дело вкуса. С менее распространенными оболочками дело обстоит иначе. Тут различия существеннее. Perl Shell
, исполняемый файл: psh
. Оболочка сочетающая в себе функции вышеупомянутых оболочек и мощь языка Perl. Т.к. psh написана на perl она может запускаться даже на Windows. Несколько примеров использования psh: Scsh
, исполняемый файл scsh
. Командный интерпретатор с открытым кодом использующий в качестве скриптового языка Scheme 48. Не поддерживает стандартные для других оболочек функции (история команд, редактирование текста в командной строке, дополнение путей/команд). Рекомендуется написания скриптов, но не для интерактивной работы. Может прийтись по вкусу любителям функционального программирования. Ниже приведен пример скрипта, который выводит имена всех исполняемых файлов находящихся в каталогах из переменной окружения PATH IPython
. Это интерактивная оболочка для языка программирования Python, имеющая ряд дополнительных функций. IPython имеет специальный профиль для работы в качестве системной командной оболочки. Способ запуска этого режима зависит, как я понял, от версии, но на моей машине это выглядит так: О IPython уже написано довольно много в том числе и на русском языке (ссылки в конце статьи). Постараюсь перечислить его основные фичи с точки зрения применения его как командной оболочки: Sleep Dummy Shell
, исполняемый файл: sleepshell
. Строго говоря командным процессором sleepshell назвать нельзя, т.к. он не умеет обрабатывать команды. И вообще не умеет ничего, кроме как периодически записывать в стандартный вывод звёздочки "*". Однако используется она именно в качестве командной оболочки и вот для чего: Допустим мы хотим предоставить кому-то возможность делать тоннели ssh через наш сервер под управлением Linux или Unix. Подробнее про ssh-туннелирование читаем . Но нам не нужно при этом, что этот кто-то получил доступ к командной строке и файловой системе нашего сервера. Для такого случая и предназначена sleepshell. Создаем на сервере аккаунт в качестве шела для него устанавливаем sleepshell. Владелец аккаунта сможет подключаться и пробрасывать порты, но не сможет выполнять команды. На этом всё. Надеюсь, что было интересно. Буду рад любым замечаниям и советам по тексту статьи.,
9 уничтожение (не перехватывается),
15 окончание выполнения.
Для защиты от прерываний существует команда "trap", имеющая формат:
О наиболее интересных из них и пойдет речь.
Целью написания статьи не был обзор или классификация всех существующих командных оболочек. Просто хочу рассказать о некоторых интересных продуктах в этой области, расширить кругозор читателя. Буду рад. если этим сподвигну кого-то к более детальному изучению темы или даже к тому, чтоб перейти на другой шел.
Сначала коротко о том, что же это такое. Командная оболочка или командный интерпретатор- это приложение предоставляющее пользователю интерфейс командной строки в которой тот либо вводит команды по отдельности, либо запускает скрипты состоящие из списка команд. Устно и в неофициальных текстах часто называется «шел», от английского shell - оболочка.Bourne shell и его клоны
Кроме того существует довольно много оболочек попадающих в эту группу: Korn shell (ksh) и Almquist shell (ash) etc но не будем подробно на них останавливаться.C shell
Для того чтоб наглядно показать разницу в синтаксисе приведу несколько примеров скриптов делающих одно и то же для csh и sh-совместимого командного интерпретатора. #!/bin/sh
i=2
j=1
while [ $j -le 10 ]; do
echo "2 **" $j = $i
i=`expr $i "*" 2`
j=`expr $j + 1`
done
#!/bin/csh
set i = 2
set j = 1
while ($j <= 10)
echo "2 **" $j = $i
@ i *= 2
@ j++
end
Командные оболочки, базирующиеся на популярных языках программирования.
ls | s/y/k/ # Замена c помощью регулярных выражений
ls | { print ++$i, ": $_"; }q # Быстрые фильтр. Внутри фигурных скобок выражение на perl, где $_ содержит одну строку вывода.
netstat | { $_>2; }g # grep-фильтры. Выводятся только те строки для которых выражение в скобках возвращает true
command >[=FOO] # Перенаправление по дескриптору открытого файла
command > file # Эквивалентно command 2> file на bash. Перенаправляет в файл поток вывода и ошибок
grep foo lib/**/*.pm # Использование **, что означает текущий каталог и все подкаталоги
#!/usr/local/bin/scsh -s
!#
(define (executables dir)
(with-cwd dir
(filter file-executable? (directory-files dir #t))))
(define (writeln x) (display x) (newline))
(for-each writeln
(append-map executables ((infix-splitter ":") (getenv "PATH"))))
ipython3 --profile=pysh
Как видите, по своим интерактивным возможностям IPython как минимум не уступает bash. Что же касается скриптов, то IPython будет удобен тем, кто знает python лучше чем bash. По сути скрипты на IPython будут отличаться от чистого питона только упрошенным вызовом системных команд. Приведу несколько примеров интеграции python и системных команд:
# Допустим нам захотелось посчитать сумарный размер файлов логов dpkg:
In : cd /var/log/
/var/log
In : log_files = !ls -l dpkg.log*
In : log_files
Out: "-rw-r--r-- 1 root root 1824 нояб. 3 16:41 dpkg.log"
In : for line in log_files:
....: size += int(line.split())
....:
In : size
Out: 1330009
# ... или последовательно пингануть десяток хостов
In : for i in range(100,110):
....: !ping -c 1 192.168.0.$i
....:
Остальные
Конечно это не полный список даже популярных оболочек. Помимо вышеперечисленных категорий существуют ещё использующие собственный синтаксис, не совместимый с sh и не копирующий существующие ЯП. Примером может служить friendly interactive shell (fish) . Но на последок хотел бы рассказать не о ней, а более специфической sleepshell.Ссылки по теме
www.faqs.org/faqs/unix-faq/shell/shell-differences - сводная таблица различий и сходств командных оболочек
www.mariovaldez.net/software/sleepshell - Sleep Dummy Shell
ipython.org/ipython-doc/dev/interactive/shell.html - IPython as a system shell
www.opennet.ru/base/dev/ipython_sysadmin.txt.html - Оболочка IPython как инструмент системного администратора