2 какие типы командных оболочек вы знаете
Перейти к содержимому

2 какие типы командных оболочек вы знаете

  • автор:

Типы командных оболочек

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

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

Командная оболочка является не только интерпретатором команд, которые вводятся в интерактивном режиме, но также и мощным языком программирования. С помощью командных оболочек можно выполнять скрипты командных оболочек (shell scripts). В скриптах несколько команд оболочки объединяются в один пакет (batch). Скрипты командных оболочек системы Linux имеют аналогию с командными файлами (batch files) системы MS-DOS. Скрипты являются очень мощным средством, с помощью которого можно автоматизировать и сделать более удобным использование системы Linux. Скриптам командной оболочки далее будет посвящён специальный раздел.

В системах Linux имеется несколько типов командных оболочек. Два основных типа называются Bourne shell и C shell. Оболочка Bourne shell использует такой же синтаксис команд, какой использовался в самых первых системах UNIX, таких как System III. Исполняемым файлом оболочки Bourne shell в большинстве версий систем Linux является /bin/sh (где sh является сокращением от « shell »═ — оболочка). Оболочка C shell использует иной синтаксис, чем-то напоминающий язык программирования C. В большинстве систем Linux исполняемым файлом этой оболочки будет /bin/csh.

В системе Linux имеются несколько вариантов указанных командных оболочек. Наиболее употребительным является вариант Bourne Again Shell или « bash » (файл /bin/ bash ), а также tcsh (файл /bin/tcsh). Оболочка bash является модификацией оболочки Bourne shell, в которую включено много развитых функций из оболочки C shell. Поскольку синтаксис оболочки bash содержит в качестве подмножества синтаксис оболочки Bourne shell, скрипты, написанные для стандартной оболочки Bourne shell, будут работать и с её модификацией bash . Если вы предпочитаете использовать синтаксис, основанный на языке программирования C, то можно воспользоваться оболочкой tcsh, которая является расширенной версией исходной оболочки C shell.

Выбор типа оболочки является вопросом вкуса. Некоторая разница заключается в том, что синтаксис оболочек, основанных на языке C, более структурирован. Для обычных команд, таких как cp или ls, тип используемой командной оболочки не имеет значения═ — синтаксис будет одинаковым. Только когда вы начнёте самостоятельно писать скрипты или использовать некоторые развитые возможности командных оболочек, разница между ними начнёт играть роль.

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

Книга «Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание»

image

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

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

Что исчезло во втором издании

В этой книге описываются типичные сложности, с которыми можно столкнуться при попытке написать переносимое автоматизированное решение, например, для сборки программного обеспечения или координации действий других программ, и способы их преодоления. Решения в книге подаются так, чтобы вы могли взять их за основу и экстраполировать на другие схожие задачи. Например, в главе 1 мы напишем переносимую версию программы echo в виде небольшого сценария-обертки. Многим системным администраторам может пригодиться этот конкретный сценарий, но основная идея заключается в том, чтобы создать сценарий-обертку, гарантирующий единообразие поведения на разных платформах. Далее в книге мы разберем некоторые интересные особенности сценариев на языке bash и типичные утилиты, доступные в системах Unix и дающие нам самые широкие возможности.

Эта книга для вас, если.

Bash остается основным инструментом для всех, кто работает с серверами или рабочими станциями, действующими под управлением Unix-подобных операционных систем, в том числе и для веб-разработчиков (многие из которых ведут разработку в OS X и развертывают свои приложения на серверах под Linux), аналитиков, разработчиков мобильных приложений и программистов. Кроме того, все больше появляется энтузиастов, запускающих Linux на своих микрокомпьютерах с открытой архитектурой, таких как Raspberry Pi, для автоматизации бытовых приборов. Сценарии командной оболочки отлично походят для всех этих случаев.

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

Эта книга — не учебник! Наша цель — продемонстрировать практические приемы программирования сценариев на bash и познакомить с распространенными утилитами на (в большинстве) коротких и компактных примерах, но мы не описываем их строку за строкой. Мы объясняем только самые основные части, а опытные создатели сценариев смогут сами понять, как действует остальной код, прочитав его. Мы надеемся, что вы, уважаемый читатель, будете экспериментировать с этими сценариями — ломать их, исправлять и приспосабливать под свои нужды — чтобы понять, как они работают. Главная наша цель — показать, как решать типичные задачи, такие как управление сетью или синхронизация файлов, которые встают перед любым техническим специалистом.

Структура книги

Это второе издание включает дополненные оригинальные 12 глав и 3 новые главы. Каждая глава демонстрирует новые особенности или варианты использования сценариев командной оболочки, и вместе они охватывают всю широту возможностей сценариев для более простой работы в Unix. Большинство сценариев, представленных в книге, будет работать и в Linux, и в OS X. В иных случаях мы напишем об этом прямо.

Глава 0: Краткое введение в сценарии командной оболочки
Это совершенно новая глава, появившаяся во втором издании, которая послужит начинающим пользователям Unix кратким введением в синтаксис языка командной оболочки bash и особенности его использования. Эта глава быстро и без лирических отступлений расскажет все, что потребуется для успешного чтения главы 1: от простого определения сценариев командной оболочки до создания и выполнения незамысловатых примеров.

Глава 1: Отсутствующая библиотека
Языки программирования, широко используемые в окружении Unix, такие как C, Perl и Python, имеют обширные библиотеки разнообразных функций и утилит для проверки форматов чисел, вычисления интервалов времени между датами и решения многих других задач. Но, работая с командной оболочкой, мы почти со всем вынуждены справляться самостоятельно, поэтому в данной главе рассказывается об инструментах и приемах, которые сделают сценарии командной оболочки более дружественными. Все, что вы узнаете в первой главе, поможет вам читать сценарии, с которыми вы встретитесь в этой книге, и писать свои. Мы включили сюда разные функции проверки ввода, простой и мощный интерфейс к bc, инструмент быстрого добавления запятых для улучшения читаемости больших чисел, прием для разновидностей Unix, в которых команда echo не поддерживает полезный флаг -n, и сценарий для использования ANSI-последовательностей определения цвета в сценариях.

Главы 2 и 3: Усовершенствование пользовательских команд и Создание утилит
Эти две главы представляют новые команды, дополняющие и расширяющие стандартный инструментарий Unix. В конце концов, постоянное развитие и совершенствование — одна из отличительных черт Unix. Мы также причастны к этому процессу и в главах 2 и 3 предлагаем сценарии, которые реализуют: дружественный интерактивный калькулятор, инструмент удаления файлов, не стирающий их с диска, две системы напоминаний и слежения за событиями, усовершенствованную версию команды locate, команду date с поддержкой нескольких часовых поясов и новую версию команды ls, добавляющую в списки содержимого каталогов дополнительные данные.

Глава 4: Тонкая настройка Unix
Может прозвучать как ересь, но некоторые аспекты Unix выглядят недоработанными даже спустя десятилетия развития. Если вам доведется пользоваться разными версиями Unix, например переходить со свободно распространяемых дистрибутивов Linux на коммерческие версии Unix, такие как OS X, Solaris или Red Hat, вы столкнетесь с отсутствующими флагами и командами, с противоречивым поведением некоторых команд и другими подобными проблемами. Поэтому в данной главе будут представлены переделанные версии и интерфейсы к командам Unix, которые делают их чуть более дружественными или более согласованными с другими разновидностями Unix. Среди всего прочего здесь описывается способ добавления длинных флагов в стиле GNU в команды, не являющиеся командами GNU. Здесь же вы найдете пару интеллектуальных сценариев, упрощающих работу с разными утилитами сжатия файлов.

Главы 5 и 6: Системное администрирование: управление пользователями и обслуживание системы
Если вас заинтересовала наша книга, вполне вероятно, что у вас есть привилегии администратора и вы несете ответственность за администрирование одной или нескольких систем Unix, даже если речь идет всего лишь о персональном компьютере с Ubuntu или BSD. Эти две главы содержат несколько сценариев, которые помогут вам в администрировании, в том числе: утилиты для анализа использования дискового пространства, система дисковых квот, которая автоматически извещает пользователей по электронной почте о превышении выделенного им места на диске, улучшенная реализация команды killall, сценарий проверки crontab, инструмент ротации файлов журналов и пара утилит для создания резервных копий.

Глава 7: Пользователи Интернета
Эта глава включает пакет по-настоящему интересных сценариев командной оболочки, демонстрирующих некоторые замечательные и простые приемы использования командной строки Unix для работы с ресурсами в Интернете. В том числе: инструмент для извлечения адресов URL из любой веб-страницы, инструмент для получения прогноза погоды, инструмент поиска в базах данных видеофильмов и инструмент для обнаружения изменений на веб-сайте, который автоматически сообщает о них по электронной почте.

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

Главы 9 и 10: Администрирование веб-сервера и Администрирование интернет-сервера
Эти две главы описывают решение проблем, с которыми часто сталкиваются администраторы серверов, имеющих выход в Интернет. Здесь вы найдете два сценария, анализирующие разные аспекты журналирования трафика веб-сервера, инструменты для выявления недействительных внутренних или внешних ссылок, имеющихся на веб-сайте, а также удобный инструмент управления паролями на веб-сервере Apache, упрощающий поддержку файлов .htaccess. Помимо этого исследуются приемы зеркалирования каталогов и целых веб-сайтов.

Глава 11: Сценарии для OS X
OS X, с ее коммерчески успешным и привлекательным графическим интерфейсом, стала огромным шагом вперед в превращении Unix в дружественную операционную систему. Что еще более важно, OS X — это полноценная операционная система Unix, скрытая за симпатичным интерфейсом, а значит, для нее можно написать много полезных и поучительных сценариев. Именно об этом рассказывается в данной главе. В дополнение к инструменту для автоматизации захвата изображения на экране, в этой главе представлены сценарии, помогающие исследовать структуру библиотеки музыкальных произведений iTunes, изменять заголовки окон программы Terminal и усовершенствовать команду open.

Глава 12: Сценарии для игр и забав
Что это за книга о программировании, если в ней не будет хотя бы пары игрушек? Глава 12 объединяет многие идеи и приемы, представленные ранее, и описывает создание шести забавных и довольно сложных игр. Хотя глава написана, чтобы вас развлечь, код каждой игры весьма поучителен. Особенно примечательна игра «Виселица», демонстрирующая некоторые хитрости и необычные приемы программирования сценариев.

Глава 13: Работа в облаке
С момента выхода первого издания этой книги Интернет занимал все больше и больше места в нашей повседневной жизни. Особенно важна для нас тема синхронизации устройств и файлов с облачными службами, такими как iCloud, Dropbox и Google Drive. В главе демонстрируются сценарии командной оболочки, позволяющие в полной мере использовать эти службы и гарантировать своевременную синхронизацию и копирование файлов и каталогов. Кроме того, здесь вы найдете пару сценариев, использующих особенности OS X для работы с фотографиями и озвучивания текста.

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

Глава 15: Дни и даты
Заключительная глава демонстрирует приемы, упрощающие операции с датами и временем: сколько дней разделяют две даты, на какой день недели приходится число или сколько дней осталось до него. Мы решим эти задачи с помощью простых в использовании сценариев командной оболочки.

Приложение A: Установка Bash в Windows 10
Пока мы работали над вторым изданием, компания Microsoft существенно изменила свое отношение к открытому программному обеспечению и в 2016 году даже выпустила полноценную систему bash для Windows 10. Несмотря на то что примеры из книги не тестировались в этой версии bash, многие идеи и решения будет нетрудно перенести в нее. В приложении мы опишем установку bash в Windows 10, чтобы вы могли попробовать свои силы в создании сценариев на компьютере с Windows!

Приложение Б: Дополнительные сценарии
Любой хороший скаут знает, что всегда должен быть запасной план! Работая над этой книгой, мы создавали запасные сценарии на случай, если нам понадобится заменить какой-нибудь из основных. В итоге резервные сценарии нам не потребовались, но с нашей стороны было бы некрасиво держать их в секрете от вас, наших друзей. Это приложение включает три дополнительных сценария: для массового переименования файлов, для массового выполнения команд и для вычисления фаз луны, — которые мы не могли утаить после того, как показали вам 101 сценарий.

Об авторах

Дейв Тейлор (Dave Taylor) работает в компьютерной индустрии с 1980 года. Участвовал в создании BSD 4.4 UNIX, его программы включены во все основные дистрибутивы UNIX. Выдающийся оратор и автор тысяч статей для журналов и газет. Написал более 20 книг, включая «Learning Unix for OS X» (O’Reilly Media), «Solaris 9 for Dummies» (Wiley Publishing) и «Sams Teach Yourself Unix in 24 Hours» (Sams Publishing). Популярный колумнист журнала «Linux Journal» и основатель веб-сайта askdavetaylor.com, где осуществляет техническую поддержку пользователей и выкладывает обзоры новых гаджетов.

Брендон Перри (Brandon Perry) начал писать приложения на C# с выходом открытой реализации .NET — Mono. В свободное время любит писать модули для фреймворка Metasploit, исследовать двоичные файлы и тестировать всякие штуки.

О научном рецензенте

Джорди Гутьеррес Эрмосо (Jordi Gutiérrez Hermoso) — программист, математик и вольный хакер. Начиная с 2002 года пользуется исключительно Debian GNU/Linux не только дома, но и на работе. Джорди участвует в разработке GNU Octave, бесплатной вычислительной среды, во многом совместимой с Matlab, а также Mercurial, распределенной системы управления версиями. Увлекается чистой и прикладной математикой, катанием на коньках, плаванием и вязанием. В последнее время много думает о проблемах выброса парниковых газов и участвует в акциях по сохранению носорогов.

Для Хаброжителей скидка 25% по купону — Shell Scripts

Unix2019a/Командная оболочка

Командная оболочка UNIX (англ. Unix shell, часто просто «шелл») — командный интерпретатор, используемый в операционных системах семейства Unix, в котором пользователь может либо давать команды операционной системе по отдельности, либо запускать скрипты, состоящие из списка команд.

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

  • 1 Виды
  • 2 История
    • 2.1 Thompson shell
    • 2.2 Bourne shell
    • 2.3 C shell
    • 3.1 Оболочки в Ubuntu
    • 3.2 Узнать текущую оболочку
    • 5.1 Шебанг (shebang)
    • 5.2 Переменная окружения PATH
    • 5.3 /usr/bin/env
    • 5.4 Не используйте /bin/bash
    • 5.5 Создание сценариев командной оболочки (шелл-скриптов)

    Виды

    В первую очередь, под shell понимаются POSIX-совместимые оболочки, восходящие к Bourne shell (шелл Борна).

    Условно оболочки можно разделить их на четыре группы:

    • Клоны Bourne shell (bash, zsh)
    • C shell (csh, tcsh)
    • Базирующиеся на популярных языках программирования (psh, ipython, scsh)
    • Экзотические, специфические и все остальные

    История

    Thompson shell

    Первая оболочка Unix — Thompson shell, написанная Кеном Томпсоном в Bell Labs (1971–1975). По современным представлениям выглядит неразвитой, но уже поддерживала перенаправления ввода/вывода, метасимволы (wildcards) для имён файлов, простые управляющие выражения с if, goto (но они были сделаны через отдельные программы). Эта оболочка проектировалась под влиянием оболочки Multics, которая, в свою очередь, делалась на базе программы RUNCOM. Это название можно встретить на современных системах в суффиксе «rc» файлов конфигурации (например, .vimrc и .bashrc).

    Так, у Томпсона перенаправление выглядело следующим образом:

    command1 >command2>

    Такой синтаксис был затем заменён на привычный

    command1 | command2

    Затем появилась оболочка PWB shell (другое название — Mashey shell) (1975–1977). Там появились переменные (предшественники переменных окружения), доступ к ним через $, запуск скриптов, доработаны операторы if/then/else/endif, switch/breaksw/endsw и while/end/break/continue. Но она не стала особо популярной.

    Позже появились оболочки Bourne shell и C shell, которые оказали наибольшее влияние на развитие Unix-оболочек.

    Bourne shell

    Stephen R. Bourne

    Оболочка Bourne shell (часто называют sh по имени исполняемого файла) разработана с нуля Стивеном Борном (Stephen R. Bourne). Внедрена в ОС Unix в 1979 г (в седьмую версию ОС). Большая часть операторов была заимствована им из языка ALGOL 68. Например, наследие этого языка: перевёрнутое ключевое слово используется для завершения блока (iffi, caseesac). Приглашение командной строки отображается в виде доллара $.

    Оболочка Борна выполняла две основные задачи:

    • служила интерпретатором команд, позволяя выполнять команды в интерактивном режиме;
    • позволяла создавать сценарии (скрипты), которые можно было неоднократно вызывать с помощью оболочки.

    Новая командная оболочка Bourne again shell (bash) разработана в 1987 году Брайаном Фоксом (Brian Fox) в рамках Free Software Foundation (Столлман). Фамилия Bourne (Борн) перекликается с английским словом born, означающим «родившийся», отсюда: рождённая-вновь-командная оболочка.

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

    Командная оболочка Z shell (исполняемый файл zsh) — свободная современная sh-совместимая оболочка. Имеет ряд преимуществ перед bash, касающихся в основном работы в интерактивном режиме. Первая версия zsh была написана Паулем Фалстадом (Paul Falstad) в 1990 году.

    C shell

    Оболочка csh написана Биллом Джоем (Bill Joy) в университете Беркли в рамках проекта по реализации BSD Unix (1979). Билл также известен как автор текстового редактора vi.

    За основу для скриптового языка csh был взят, как понятно из названия, язык C. Т.к. на тот момент, в 1978 г., это был наиболее популярный язык программирования среди разработчиков и пользователей BSD UNIX.

    В настоящий момент более популярна свободная реализация csh — tcsh, или TENEX C Shell. Именно в tcsh когда-то впервые появилось автодополнение. Является оболочкой по умолчанию в FreeBSD.

    #!/bin/sh if [ $days -gt 365 ] then echo This is over a year. fi
    #!/bin/csh if ( $days > 365 ) then echo This is over a year. endif
    #!/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

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

    Кроме недостатка функциональности, можно заметить, что количество книг, справочных ресурсов, вопросов на Stackoverflow и пр. для tcsh гораздо меньше, чем для bash.

    Современное состояние

    Традиционно в Unix-системах шелл Борна называется sh и, согласно FHS, лежит в /bin/sh. На настоящих системах это часто символическая или жёсткая ссылка на один из альтернативных шеллов:

    • ash (Almquist shell, оболочка Альмквиста);
    • bash (Bourne-again shell, «ещё-одна-командная-оболочка-Борна»);
    • dash (Debian Almquist shell);
    • ksh (Korn shell);
    • zsh (Z shell, современная, имеет ряд преимуществ перед bash касающихся в основном работы в интерактивном режиме);
    • BusyBox — современная микро-версия, предназначенные для встраиваемых систем;
    • .

    Стандарт POSIX специфицирует стандартную оболочку как строгое подмножество Korn shell, расширенной версии оригинальной Bourne shell.

    Bash — одна из наиболее популярных современных разновидностей командной оболочки. Особенно популярна в среде Linux, где она часто используется в качестве предустановленной командной оболочки.

    Оболочки в Ubuntu

    Начиная с версии Ubuntu 6.10 (октябрь 2006 г.), ссылка /bin/sh изменена с bash на dash. Это привело к неработоспособности многочисленных скриптов.

    bash остаётся оболочкой для входа в систему по умолчанию.

    Главная причина — эффективность. Оболочка dash более легковесна, при загрузке ОС выполняется большое количество скриптов, в которых возможности bash избыточны.

    sobols@sobols-VirtualBox:~$ ls /bin/*sh -l -rwxr-xr-x 1 root root 1017016 Крс 24 2014 /bin/bash -rwxr-xr-x 1 root root 121272 Лют 19 2014 /bin/dash lrwxrwxrwx 1 root root 4 Врс 19 2014 /bin/rbash -> bash lrwxrwxrwx 1 root root 9 Врс 14 09:36 /bin/sh -> /bin/dash lrwxrwxrwx 1 root root 7 Врс 19 2014 /bin/static-sh -> busybox

    Узнать текущую оболочку

    echo $0 echo $SHELL

    Терминалы

    Ядра UNIX-систем имеют общее понятие терминалов. Терминал предоставляет возможность приложениям отображать выходные данные и принимать входные данные через терминальное устройство. Процесс может иметь управляющий терминал — для приложения с текстовым режимом, так он взаимодействует с пользователем.

    Терминалы могут быть:

    • аппаратными терминалами («tty», от «телетайп»),
    • псевдотерминалами («pty»).

    Аппаратные терминалы подключаются через некоторый интерфейс, такой как последовательный порт (ttyS0, . ) или USB (ttyUSB0, . ), или через экран ПК и клавиатуру (tty1, . ). Псевдотерминалы предоставляются терминальным эмулятором, который является приложением. Файлы в каталоге /dev/pts являются псевдотерминалами.

    Некоторые типы псевдотерминалов:

    • Приложения GUI, такие как xterm, gnome-terminal, konsole, . преобразуют клавиатуру и события мыши в текстовый ввод и вывод изображения графически некоторым шрифтом.
    • Мультиплексорные приложения, такие как screen и tmux, передают ввод и вывод на другой терминал, чтобы отделить приложения от фактического терминала.
    • Удаленные приложения оболочки, такие как sshd, telnetd, rlogind, . передают ввод и вывод между удалённым терминалом на клиенте и pty на сервере.

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

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

    Чтобы поэкспериментировать, запустите команду tty в терминале, чтобы узнать, какое терминальное устройство используется. Скажем, это /dev/pts/42. В шелле в другом терминале запустите echo

    echo hello> /dev/pts/42

    Приветствие hello будет отображаться на другом терминале. Теперь запустите

    cat /dev/pts/42

    и введите в другой терминал. Чтобы убить эту команду, нажмите Ctrl+C.

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

    При нажатии клавиш Ctrl+Alt+F1, Ctrl+Alt+F2, из графической оболочки Linux-дистрибутива можно попасть в текстовый режим в терминалы tty1, tty2, . Для возврата обратно в графический режим обычно можно нажать Ctrl+Alt+F7.

    Запуск программ

    • бинарные исполняемые файлы (в формате ELF и пр.);
    • текстовые программы (скрипты) на интерпретируемых языках.

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

    Шебанг (shebang)

    Последовательность из двух символов: решётки и восклицательного знака (#!) в начале файла скрипта.

    Когда скрипт с шебангом выполняется как программа в UNIX-подобных операционных системах, загрузчик программ рассматривает остаток строки после шебанга как имя файла программы-интерпретатора. Загрузчик запускает эту программу и передаёт ей в качестве параметра имя файла скрипта с шебангом.

    #!interpreter [optional-arg]

    interpreter должен быть абсолютным путём.

    Пример: в файле some/path/to/foo записано

    #!/bin/sh -x

    и он запускается как

    some/path/to/foo bar baz

    Это то же самое, что запустить

    /bin/sh -x some/path/to/foo bar baz

    Вопрос: что будет, если запустить

    #!/bin/cat Hello world!

    Ответ: напечатаются обе строки.

    Переменная окружения PATH

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

    На POSIX и Unix-подобных операционных системах переменная PATH задана как одно или несколько имён каталогов, разделённых двоеточиями (:).

    echo $PATH

    Согласно стандарту POSIX, использовать каталоги с двоеточием в имени не получится.

    Since is a separator in this context, directory names that might be used in PATH should not include a character.

    В основном в переменную PATH входят каталоги /bin, /usr/bin и /usr/local/bin.

    Текущий каталог (.) обычно в PATH не входит из соображений безопасности, чтобы избежать случайного исполнения скриптов из текущего каталога. Запуск такой программы требует написания (./) перед названием.

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

    /usr/bin/env

    Для переносимости, чтобы не указывать полный путь к интерпретатору, в шебанг прописывают программу /usr/bin/env. Например,

    /usr/bin/env python

    запустит первый python, который будет найден в PATH.

    Пусть есть следующий скрипт на Python:

    #!/usr/bin/env python import sys print sys.executable
    sobols@sobols-VirtualBox:~/unix/path$ ./main.py /usr/bin/python sobols@sobols-VirtualBox:~/unix/path$ virtualenv venv Running virtualenv with interpreter /usr/bin/python2 New python executable in /home/sobols/unix/path/venv/bin/python2 Also creating executable in /home/sobols/unix/path/venv/bin/python Installing setuptools, pkg_resources, pip, wheel. done. sobols@sobols-VirtualBox:~/unix/path$ source ./venv/bin/activate (venv) sobols@sobols-VirtualBox:~/unix/path$ ./main.py /home/sobols/unix/path/venv/bin/python

    Не используйте /bin/bash

    #!/bin/bash в качестве shebang использовать не стоит, т. к. место расположения bash не специфицируется FHS (в принципе, он может лежать в /usr/bin/bash, например – так обстоят дела по крайней мере в некоторых версиях FreeBSD).

    #!/bin/bash
    #!/usr/bin/env bash

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

    #!/bin/sh

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

    Создание сценариев командной оболочки (шелл-скриптов)

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

    • nano / mcedit (mc F4) / evim
    • gedit
    • Sublime Text
    • .

    Расширение файла значения не имеет. Часто используется .sh.

    О разных командных оболочках Linux и Unix

    image

    Наверняка почти все читатели Хабра знают оболочки sh и bash. Так же большинство из нас что-то слышали про zsh и tcsh. Однако на этом список существующих оболочек не заканчивается. Условно можно разделить их на три группы:

    • Клоны Bourne shell (bash, zsh)
    • C shell (csh, tcsh)
    • Базирующиеся на популярных языках программирования(psh, ipython, scsh)
    • Экзотические, специфические и все остальные

    Наибольшее распространение получили POSIX-совместимые оболочки, ведущие родословную от Bourne shell (шелл Борна), поэтому с него и начнем

    Bourne shell и его клоны

    Bourne shell, исполняемый файл: sh. Командная оболочка названная в честь своего создателя Стивена Борна. Большая часть операторов была заимствована им из языка Алгол 68. Вышла в 7-м издании операционной системы UNIX, где была оболочкой по умолчанию. До сих пор подавляющее большинство Unix-подобных систем имеют /bin/sh — символическую или жесткую ссылку на sh-совместимую оболочку.

    Bourne again shell, исполняемый файл: bash. Название можно перевести, как «Возрождённый шел Борна». Скорее всего самая популярная оболочка на сегодняшний день. Де-факто стандарт для Linux. Не буду на ней останавливаться, т.к. в интернете много хороших статей про bash. Например вот и вот.

    Z shell, исполняемый файл: zsh. Свободная современная sh-совместимая оболочка. Имеет ряд преимуществ перед bash касающихся в основном работы в интерактивном режиме. О ней на Хабре писали тут и тут
    Кроме того существует довольно много оболочек попадающих в эту группу: Korn shell (ksh) и Almquist shell (ash) etc но не будем подробно на них останавливаться.

    C shell

    C shell, исполняемый файл: csh Командная оболочка разработанная автором vi Биллом Джоем. За основу для скриптового языка csh был взят, как понятно из названия, язык C. Т.к. на тот момент, в 1978 г., это был наиболее популярный язык программирования среди разработчиков и пользователей BSD UNIX. В настоящий момент более популярна свободная реализация csh — tcsh.

    TENEX C Shell, исполняемый файл: tcsh. Именно в tcsh когда-то впервые появилось автодополнение. Является оболочкой по умолчанию в FreeBSD. Подробнее о ней почитать можно здесь.
    Для того чтоб наглядно показать разницу в синтаксисе приведу несколько примеров скриптов делающих одно и то же для csh и sh-совместимого командного интерпретатора.

    #!/bin/sh if [ $days -gt 365 ] then echo This is over a year. fi 
    #!/bin/csh if ( $days > 365 ) then echo This is over a year. endif 

    Множественное ветвление (Переключатель, Swich/case):

    #!/bin/sh for i in d* do case $i in d?) echo $i is short ;; *) echo $i is long ;; esac done 
    #!/bin/csh foreach i ( d* ) switch ( $i ) case d?: echo $i is short breaksw default: echo $i is long endsw end 

    Цикл вычисляющий 10 первых степеней двойки:

    #!/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  

    Однако список фичь поддерживаемых свежими версиями bash, zsh и tcsh очень похож и выбор конкретной оболочки по большей части дело вкуса. С менее распространенными оболочками дело обстоит иначе. Тут различия существеннее.

    Командные оболочки, базирующиеся на популярных языках программирования.

    Perl Shell, исполняемый файл: psh. Оболочка сочетающая в себе функции вышеупомянутых оболочек и мощь языка Perl. Т.к. psh написана на perl она может запускаться даже на Windows. Несколько примеров использования psh:

     ls | s/y/k/ # Замена c помощью регулярных выражений ls | < print ++$i, ": $_"; >q # Быстрые фильтр. Внутри фигурных скобок выражение на perl, где $_ содержит одну строку вывода. netstat | < $_[1]>2; >g # grep-фильтры. Выводятся только те строки для которых выражение в скобках возвращает true command >[=FOO] # Перенаправление по дескриптору открытого файла command >[2] file # Эквивалентно command 2> file на bash. Перенаправляет в файл поток вывода и ошибок grep foo lib/**/*.pm # Использование **, что означает текущий каталог и все подкаталоги 

    Scsh, исполняемый файл scsh. Командный интерпретатор с открытым кодом использующий в качестве скриптового языка Scheme 48. Не поддерживает стандартные для других оболочек функции (история команд, редактирование текста в командной строке, дополнение путей/команд). Рекомендуется написания скриптов, но не для интерактивной работы. Может прийтись по вкусу любителям функционального программирования. Ниже приведен пример скрипта, который выводит имена всех исполняемых файлов находящихся в каталогах из переменной окружения PATH

    #!/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")))) 

    IPython. Это интерактивная оболочка для языка программирования Python, имеющая ряд дополнительных функций. IPython имеет специальный профиль для работы в качестве системной командной оболочки. Способ запуска этого режима зависит, как я понял, от версии, но на моей машине это выглядит так:
    ipython3 --profile=pysh

    • Кросплатформенность. Есть даже версия под Windows
    • Python версий 2.x или 3.x в качестве скриптового языка, расширенные возможности интроспекции
    • Автодополнение кода Python а так же имен файлов и системных команд.
    • История команд и макросы на ее основе
    • Механизм ускоряющий навигацию по каталогам, закладки и многое другое
    # Допустим нам захотелось посчитать сумарный размер файлов логов dpkg: In [58]: cd /var/log/ /var/log In [59]: log_files = !ls -l dpkg.log* In [60]: log_files[0] Out[60]: '-rw-r--r-- 1 root root 1824 нояб. 3 16:41 dpkg.log' In [61]: for line in log_files: . size += int(line.split()[4]) . In [62]: size Out[62]: 1330009 # . или последовательно пингануть десяток хостов In [67]: for i in range(100,110): . !ping -c 1 192.168.0.$i . 
    Остальные

    Конечно это не полный список даже популярных оболочек. Помимо вышеперечисленных категорий существуют ещё использующие собственный синтаксис, не совместимый с sh и не копирующий существующие ЯП . Примером может служить friendly interactive shell (fish). Но на последок хотел бы рассказать не о ней, а более специфической sleepshell.

    Sleep Dummy Shell, исполняемый файл: sleepshell. Строго говоря командным процессором sleepshell назвать нельзя, т.к. он не умеет обрабатывать команды. И вообще не умеет ничего, кроме как периодически записывать в стандартный вывод звёздочки "*". Однако используется она именно в качестве командной оболочки и вот для чего: Допустим мы хотим предоставить кому-то возможность делать тоннели ssh через наш сервер под управлением Linux или Unix. Подробнее про ssh-туннелирование читаем тут. Но нам не нужно при этом, что этот кто-то получил доступ к командной строке и файловой системе нашего сервера. Для такого случая и предназначена sleepshell. Создаем на сервере аккаунт в качестве шела для него устанавливаем sleepshell. Владелец аккаунта сможет подключаться и пробрасывать порты, но не сможет выполнять команды.

    На этом всё. Надеюсь, что было интересно. Буду рад любым замечаниям и советам по тексту статьи.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *