Типы оболочек в системе Linux
Оболочка (shell) — важная часть любой пользовательской сессии Linux. Для выполнения задач в Linux доступны несколько типов командных оболочек, каждая из которых имеет свои уникальные свойства. Поэтому в определенных ситуациях одна оболочка может оказаться эффективнее другой.
В этом туториале мы расскажем, что такое командная оболочка Linux и почему она важна, а также разберем их типы, функции и свойства.
Что такое оболочка и зачем она нужна?
Каждый раз, когда пользователь входит в систему или открывает окно консоли, ядро запускает новый экземпляр командной оболочки.
Ядро — это сердце любой операционной системы. Оно отвечает за управление и выполнение процессов, а также за правильное использование системных ресурсов.
Командная оболочка — это программа, которая служит интерфейсом между пользователем и ядром. Она позволяет давать команды ядру и получать от него ответы. Через нее можно запускать программы и утилиты на ядре. Таким образом, по сути оболочка — это программа, с помощью которой можно запускать другие программы в системе.
Возможность взаимодействия с ядром делает командные оболочки мощным инструментом. Без этого пользователь не сможет получить доступ к утилитам операционной системы.
Давайте разберемся в основных типах оболочек, которые доступны для среды Linux.
Типы оболочек
В Linux доступны различные типы командных оболочек, каждая из них имеет свои свойства, которые делают их более эффективными в определенных ситуациях. Итак, давайте обсудим их подробнее.
1: Bourne Shell (sh)
Разработанная в AT&T Bell Labs Стивом Борном, Bourne Shell Считается первой оболочкой UNIX. Она обозначается как sh.
Данная оболочка завоевала популярность благодаря своей компактности и высокой скорости работы. Именно это и сделало ее оболочкой по умолчанию для ОС Solaris. Также она используется как командная оболочка по умолчанию для всех административных скриптов системы Solaris.
Но у оболочки Bourne есть ряд существенных недостатков:
- Нет встроенных функций для обработки логических и арифметических операций.
- Не может запоминать ранее выполненные команды, в отличие от большинства других командных оболочек.
- Не хватает комплексных функций для удобного интерактивного использования.
По умолчанию полный путь к исполняемому файлу Bourne Shell — /bin/sh и /sbin/sh. Для пользователей root используется символ # в качестве приглашения командной строки, а для не-root пользователей — символ $.
2: GNU Bourne-Again (bash)
GNU Bourne-Again (известная также как Bash) была разработана для совместимости с оболочкой Bourne. Она включает в себя полезные функции из других шеллов Linux, таких как Korn и C.
В отличие от командной оболочки Bourne, она позволяет автоматически вызывать ранее выполненные команды и редактировать их клавишами со стрелками.
Полный путь к оболочке GNU Bourne-Again — /bin/bash. По умолчанию она использует приглашение bash-VersionNumber# для пользователя root и bash-VersionNumber$ для пользователей без прав root.
Читайте также:
3: C Shell (csh)
Оболочка C была разработана Биллом Джоем в Калифорнийском университете. Обозначается как csh. Она была создана для реализации полезных функций и синтаксиса языка программирования C.
Кроме того, у нее есть история команд, которой не было в других типах командных оболочек Linux (например, в Bourne). Еще одна отличительная особенность оболочки C — псевдонимы (aliases).
Полный путь к C shell: /bin/csh. По умолчанию она использует приглашение hostname# для пользователя с правами root и hostname% для пользователей без этих привилегий.
4: Korn Shell (ksh)
Была разработана в AT&T Bell Labs Дэвидом Корном как улучшение оболочки Bourne.
Обозначается как ksh. Командная оболочка Korn по сути является расширением Bourne. Помимо всех функций из Bourne, она предоставляет пользователям новые возможности, среди которых встроенная поддержка арифметических операций и интерактивные функции, как в C shell.
Korn запускает скрипты оболочки Bourne, выполняя операции со строками, массивами и функциями подобно языку программирования C. Она также поддерживает скрипты, написанные для оболочки C. Кроме того, Korn работает быстрее большинства других типов командных оболочек Linux, включая C shell.
Полный путь к оболочке Korn: /bin/ksh. По умолчанию, для пользователя root используется приглашение #, non-root — $.
5: Z Shell (zsh)
Командная оболочка Z, или zsh — это расширение шелла sh с улучшенной кастомизацией. Если вы ищете современную оболочку со множеством функций, Z Shell — это то, что вам нужно.
- Создание имен файлов на основе заданных условий
- Поддержка плагинов и тем
- Индекс встроенных функций
- Автовыполнение команд
Заключение
Давайте подведем итоги по типам оболочек, которые мы рассмотрели в этом мануале:
- Bourne shell (sh): полный путь /bin/sh и /sbin/sh, приглашение командной строки для root пользователя — #, для пользователей без прав root — $
- GNU Bourne-Again (bash): полный путь /bin/bash, приглашение командной строки для пользователя root — bash-VersionNumber#, без прав root — bash-VersionNumber$
- C shell (csh): полный путь /bin/csh, для пользователя с правами root приглашение командной строки — #, без этих прав —%
- Korn shell (ksh): полный путь /bin/ksh, приглашение командной строки для root пользователя #, non-root — $
- Z shell (zsh): полный путь /bin/zsh, приглашение командной строки для пользователя root — # , для пользователя без root прав — %
Командные оболочки являются одним из самых мощных инструментов, которые доступны пользователю Linux. Без них использовать функционал ядра системы практически невозможно.
Здесь мы рассмотрели наиболее распространенные типы оболочек в Linux, однако существует еще множество других, которые также стоит изучить.
О разных командных оболочках Linux и Unix
Наверняка почти все читатели Хабра знают оболочки 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
#!/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
#!/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. Владелец аккаунта сможет подключаться и пробрасывать порты, но не сможет выполнять команды.
На этом всё. Надеюсь, что было интересно. Буду рад любым замечаниям и советам по тексту статьи.