Библиотека сайта rus-linux.net
В чем разница между Bash, Zsh и другими командными оболочками для Linux?
Оригинал: What's the Difference Between Bash, Zsh, and Other Linux Shells?
Автор: Yatri Trivedi
Дата публикации: 22 июля 2011 г.
Перевод: А.Панин
Дата перевода: 10 ноября 2016 г.
Мы занялись рассмотрением вопросов, связанных с созданием сценариев командной оболочки, так как Linux может работать практически на любом устройстве. Это возможно, в том числе, благодаря гибкости используемых командных оболочек, но в чем различие между этими командными оболочками и из-за чего люди выбирают ту или иную командную оболочку?
Каково предназначение командных оболочек?
Интерфейс командной строки системы является поистине любопытным. Изначально рассматриваемый как интерфейс для самых опытных пользователей, он прошел огромный путь, в некоторой степени потеряв свою актуальность. Хотя вы все еще можете считать его очень удобным и постоянно работать с ним, на сегодняшний день он используется главным образом энтузиастами, у которых есть время на его доскональное изучение. При этом этот интерфейс будет иметь отличия в каждой из существующих операционных систем, так как каждая из этих систем по своему интерпретирует команды. На сегодняшний день это утверждение актуально для таких операционных систем, как Linux, OS X и Windows, но ранее оно было актуально для систем большинства компьютеров.
(Иллюстрация от пользователя
С течением времени командные оболочки обзавелись набором стандартных расширений и различия между ними стали попросту незаметными. Кроме того, в них было добавлено большое количество функций, таких, как автозавершение команд и имен файлов, поддержка сценариев, а также внесены изменения, положительно отразившиеся на производительности. Также была проведена большая работа над проблемами, больше всего раздражающими пользователей. Например, в Unix нельзя было переходить по символьным ссылкам в директории перед непосредственным посещением этих директорий. В конце концов, разработчики добавили в свои командные оболочки функции, позволяющие пользователям более быстро и эффективно выполнять свою работу, почти также, как в случае с альтернативными менеджерами окон для Linux.
Почему существует так много командных оболочек?
Наиболее известным предком современных командных оболочек является командная оболочка Bourne Shell, известная, как "sh" и названная в честь ее создателя Стивена Борна (Stephen Bourne) из компании AT&T. Она стала стандартным интерпретатором команд в Unix благодаря поддержке механизма подстановки команд, программных каналов, переменных, условных инструкций, циклов, а также других возможностей. В то время создание сценариев командной оболочки стало поистине популярным занятием, чего, по мнению многих людей, не скажешь сегодня. При этом она не предоставляла пользователям специальных механизмов тонкой настройки в соответствии с их потребностями, таких, как псевдонимы и автозавершение команд, а также функции (хотя последний механизм был добавлен спустя некоторое время).
Командная оболочка C shell ("csh") была разработана Билом Джоем из UCB и значительно изменила подход к использованию интерфейса командной строки системы. В нее было добавлено множество интерактивных элементов, которые могли применяться пользователями для управления их системами, таких, как псевдонимы команд (сокращения длинных команд), функции управления задачами, история команд и других. Она была смоделирована по образу и подобию языка программирования C, что было интересной идеей, так как для разработки самой операционной системы Unix также использовался язык C. Разумеется, для того, чтобы продуктивно работать с ней, пользователям Bourne Shell нужно было учить язык C, так как команды соответствовали его стандартным функциям. Кроме того, данная командная оболочка содержала поистине огромное количество ошибок, которые приходилось исправлять как пользователям, так и разработчикам в течение длительного промежутка времени. В конце концов пользователи начали использовать командную оболочку Bourne Shell для исполнения сценариев ввиду того, что она лучше обрабатывала неинтерактивные команды, а командую оболочку C shell - для выполнения всех остальных задач.
Со временем многие люди внесли свой вклад в процесс исправления ошибок и разработки новых функций C shell в рамках нового проекта "tcsh". Но проблема заключалась в том, что на компьютерах, поставляющихся с Unix, все также использовалась командная оболочка "csh" с "нестандартными" возможностями, что приводило к еще большей фрагментации интерфейсов командной строки различных компьютеров. Позднее Дэвид Корн из компании AT&T попытался исправить сложившуюся ситуацию, начав работу над командной оболочкой Korn Shell ("ksh"), использующей в качестве базиса язык командной оболочки Bourne Shell с добавлением новых возможностей, к которым привыкло большинство пользователей. К сожалению, данная командная оболочка не была свободно распространяемой.
Еще одним ответом на некачественные коммерческие реализации командной оболочки csh был стандарт интерфейса переносимой операционной системы (Portable Operating System Interface или POSIX). Это была успешная попытка создания стандарта, описывающего процесс интерпретации команд (помимо других вещей), который в конце концов вобрал в себя множество возможностей командной оболочки Korn shell. В то же время, в рамках недавно созданного проекта GNU была предпринята попытка создания свободной, полностью совместимой с Unix операционной системы. В рамках этого проекта была начата разработка новой командной оболочки Bourne Again shell с реализациями многих функций из таких командных оболочек, как sh, csh и ksh. Результат этой инициативы оказался довольно впечатляющим.
Кеннет Алмкист создал POSIX-совместимый клон командной оболочки Bourne shell под названием "ash", который впоследствии стал стандартной командной оболочкой BSD, еще одного ответвления/клона Unix. Уникальность данной командной оболочки заключается в ее реальной легковесности и именно поэтому она снискала особую популярность в мире встраиваемых Linux-систем. Если у вас есть телефон на базе Android с правами root, вы можете обнаружить в нем набор утилит BusyBox, в котором используется код из ash. Разработчики дистрибутива Debian создали клон командной оболочки ash под названием "dash".
(Иллюстрация от пользователя
Одной из самых известных командных оболочек "новой волны" является командная оболочка "zsh", разработанная Полом Фалстадом в 1990 году. Это командная оболочка, поддерживающая синтаксис командной оболочки Bourne shell с возможностями командной оболочки bash и других бывших популярными ранее командных оболочек, а также с собственными дополнительными полезными возможностями. Она осуществляет проверку синтаксиса, позволяет отслеживать события вход/выхода из системы, поддерживает функцию интерпретации байткода и научную нотацию, позволяет работать с числами с плавающей точкой и так далее. Другой подобной командной оболочкой является Friendly Interactive Shell "fish", которая поддерживает команды, которые легко запомнить и использовать.
В общем, большинство командных оболочек является клонами существовавших ранее командных оболочек с дополнительными функциями, исправлениями ошибок и более либеральными лицензиями. Основными исключениями из данного правила являются оригинальные командные оболочки Bourne shell и C shell, а также командные оболочки rc shell и ash, которые не являются полностью оригинальными, но находят своего пользователя.
Какую командную оболочку следует использовать?
При наличии огромного количества командных оболочек может показаться, что выбрать подходящую командную оболочку крайне сложно, но на самом деле это не так. Ввиду того, что многие командные оболочки основываются на командной оболочке Bourne shell, вы сможете выполнять базовые операции одним и тем же образом при работе с каждой из них.
Командная оболочка Bash является самой широко используемой командной оболочкой и поставляется по умолчанию в большинстве дистрибутивов Linux. Она действительно удобна и имеет огромное количество возможностей, большая часть из которых даже не будет использоваться вами, по крайней мере, если вы не будете разрабатывать сценарии командной оболочки, поэтому можно с уверенностью заявить, что вам стоит выбрать ее. Ввиду того, что она является самой популярной, она отлично подходит для разработки сценариев командной оболочки, которые будут использоваться на других платформах. Если же вы хотите попробовать какую-либо другую, более дружелюбную командную оболочку, вы можете установить fish.
Если вы постоянно имеете дело с встраиваемыми Linux-системами, например, устанавливая Linux на такие экзотические устройства, как Nintendo DS или вам очень нравится дистрибутив Debian, вам наверняка лучше подойдут командные оболочки ash/dash. И снова напомню о том, что данные командные оболочки работают практически так же, как и все остальные, но ввиду их легковесности, они могут не поддерживать некоторые сложные функции.
(Иллюстрация от пользователя
Если вы планируете изучать вопросы создания сценариев командной оболочки, вам придется потратить чуть больше времени на выбор командной оболочки. Командная оболочка Bash также является отличным выбором, но я знаю достаточно людей, которые перешли на Zsh из-за ее дополнительных функций. Я считаю, что выбор на самом деле зависит от сложности ваших будущих проектов и типов функций, которые вы хотели бы получить от командной оболочки. Некоторые люди используют командную оболочку tcsh по той причине, что они знают язык программирования C, регулярно используют его и им проще работать с ним, в том числе, в рамках сценариев. Если вы не уверены в том, какую командную оболочку следует выбрать, вы наверняка не имеете большого опыта в области разработки программных продуктов, поэтому вам стоит выбирать ту командную оболочку, которая будет лучше подходить для изучения интересных вам технологий и потратить дополнительное время на исследование функций всех командных оболочек.
Вы можете без каких-либо сложностей устанавливать и удалять различные командные с помощью центра приложений Ubuntu или менеджера пакетов программного обеспечения вашего любимого дистрибутива. Бинарные файлы командных оболочек размещаются в директории /bin/ и в том случае, если вы используете современный дистрибутив Linux, вы можете без каких-либо проблем изменять используемую по умолчанию командную оболочку. Просто введите следующую команду:
chsh
Вам нужно будет ввести ваш пароль, после чего вы сможете выбрать другую командную оболочку, введя путь к ее исполняемому файлу.
В квадратных скобках приведен путь к бинарному файлу текущей командной оболочки и если она устраивает вас, вы можете просто нажать клавишу Enter.
Вы используете командную оболочку Bash? Вам нравится другая командная оболочка? Какую из ее возможностей вы используете чаще всего? Поделитесь своим мнением в разделе комментариев!