Linux bash или zsh

В чем разница между 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, но ранее оно было актуально для систем большинства компьютеров.

(Иллюстрация от пользователя blakespot )

С течением времени командные оболочки обзавелись набором стандартных расширений и различия между ними стали попросту незаметными. Кроме того, в них было добавлено большое количество функций, таких, как автозавершение команд и имен файлов, поддержка сценариев, а также внесены изменения, положительно отразившиеся на производительности. Также была проведена большая работа над проблемами, больше всего раздражающими пользователей. Например, в 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».

Читайте также:  Font original windows 10

(Иллюстрация от пользователя othree )

Одной из самых известных командных оболочек «новой волны» является командная оболочка «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. И снова напомню о том, что данные командные оболочки работают практически так же, как и все остальные, но ввиду их легковесности, они могут не поддерживать некоторые сложные функции.

(Иллюстрация от пользователя renrutal )

Если вы планируете изучать вопросы создания сценариев командной оболочки, вам придется потратить чуть больше времени на выбор командной оболочки. Командная оболочка Bash также является отличным выбором, но я знаю достаточно людей, которые перешли на Zsh из-за ее дополнительных функций. Я считаю, что выбор на самом деле зависит от сложности ваших будущих проектов и типов функций, которые вы хотели бы получить от командной оболочки. Некоторые люди используют командную оболочку tcsh по той причине, что они знают язык программирования C, регулярно используют его и им проще работать с ним, в том числе, в рамках сценариев. Если вы не уверены в том, какую командную оболочку следует выбрать, вы наверняка не имеете большого опыта в области разработки программных продуктов, поэтому вам стоит выбирать ту командную оболочку, которая будет лучше подходить для изучения интересных вам технологий и потратить дополнительное время на исследование функций всех командных оболочек.

Вы можете без каких-либо сложностей устанавливать и удалять различные командные с помощью центра приложений Ubuntu или менеджера пакетов программного обеспечения вашего любимого дистрибутива. Бинарные файлы командных оболочек размещаются в директории /bin/ и в том случае, если вы используете современный дистрибутив Linux, вы можете без каких-либо проблем изменять используемую по умолчанию командную оболочку. Просто введите следующую команду:

Вам нужно будет ввести ваш пароль, после чего вы сможете выбрать другую командную оболочку, введя путь к ее исполняемому файлу.

В квадратных скобках приведен путь к бинарному файлу текущей командной оболочки и если она устраивает вас, вы можете просто нажать клавишу Enter.

Вы используете командную оболочку Bash? Вам нравится другая командная оболочка? Какую из ее возможностей вы используете чаще всего? Поделитесь своим мнением в разделе комментариев!

Источник

zsh или bash

Доброго утра народ. Подскажите вчём преимущество zsh перед bash? И если есть таковые , то почему по умолчанию в любом дистрибутиве linux идёт bash а не zsh?

вот вам на хабаре статейка https://habrahabr.ru/post/162339/. На самом деле каждый выбирает для себя сам.

А статья ещё актульна? Вроде 2012 годом датирована

И много в мире bash/zsh изменилось с 2012 года?

Про это не нескажу,ибо невладею такой информацией

Оба говно

как написал EXL особо ничего и не поменялась, и да для не осиляторов zsh, таких как я, есть fish

А есть вообще оболочки без привязки к эмулятору терминала, а то вот такое г-вно просто вымораживает: \[\033[48;5;4m\]

Вчера пытался повесить backward-kill-word на Ctrl+Backspace, так мне пришлось в эмуляторе терминала (konsole) сначала замапить Ctrl+Backspace на какое-то г-вно \E[9;3

, а уже на него вешать backward-kill-word. Шёл 2017-й год.

А есть вообще оболочки без привязки к эмулятору терминала

Не в курсе, но если есть, то они очевидно мало где работают. Пример: cmd.exe

Читайте также:  Xf adesk19 mac os

Это редкий особый случай, без кастомной последовательности символов действительно никак. На самом деле полно клавиш, никак особо не унифицированных между эмуляторами.

почему по умолчанию в любом дистрибутиве linux идёт bash а не zsh?

Ты же не думаешь, что выбор дефолтного шелла для дистрибутива основан на его крутости? Во фреебзд вообще tcsh был дефолтной оболочкой и ниче.

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

Тем не менее сам konsole прекрасно понимает все нажатые клавиши, но должен специально их портить, превращая в какую-то абра-кадабру, доставшуюся нам по наследству из 60-х (это было 50 лет назад, 50!)

Неужели нет нормальной оболочки без этих атавизмов?

полно клавиш, никак особо не унифицированных между эмуляторами

ну так я и спрашиваю: а зачем этот эмулятор вообще нужен? В иксах же все клавиши стандартизированы.

Тем не менее сам konsole прекрасно понимает все нажатые клавиши

Да, но в консоли клавиш нету.

но должен специально их портить, превращая в какую-то абра-кадабру, доставшуюся нам по наследству из 60-х (это было 50 лет назад, 50!)

Это кривое Sosnole, в нормальных эмуляторах C-BackSpace по умолчанию генерирует то же, что и BackSpace.

а зачем этот эмулятор вообще нужен?

Прочитай где-нибудь, что такое текстовый терминал.

В иксах же все клавиши стандартизированы.

Ещё раз: в текстовом терминале нет клавиш, там только символы.

почему по умолчанию в любом дистрибутиве linux идёт bash а не zsh?

Потому что bash появился раньше и успел стать «стандартом». Наличие преимуществ у чего-либо (даже если там на голову выше) редко сподвигает людей что-то менять. Иначе давно бы умер jpg в пользу bpg и flif, не был бы де факто стандартом для lossy-кодирования убогий mp3, а были бы ogg vorbis, opus, aac. Чтобы что-то заменить на нечто чуть лучше, необходимо время. Или должен быть очень серьёзный качественный скачок. zsh преимущества перед bash имеет, но не является чем-то настолько революционным, чтобы все бросились менять дефолт.

в нормальных эмуляторах C-BackSpace по умолчанию генерирует то же, что и BackSpace.

konsole тоже по умолчанию генерирует для C-BackSpace и BackSpace одно и то же, только какой в этом смысл, а? Специально чтобы я не мог сделать удобный экшн на C-BackSpace как в остальных текстовых полях (адресная строка браузера, файл-менеджера)?

Ещё раз: в текстовом терминале нет клавиш, там только символы.

Ещё раз: а зачем этот терминал вообще нужен? Почему нельзя заменить связку из иксового эмулятора терминала и терминальной оболочки просто иксовой оболочкой?

Потому что bash появился раньше и успел стать «стандартом»

На целый год раньше. Просто Bash это GNU, вот и всё.

Ещё раз: а зачем этот терминал вообще нужен?

Чтобы программы в нём запускать.

Почему нельзя заменить связку из иксового эмулятора терминала и терминальной оболочки просто иксовой оболочкой?

Ну так замени. Потом убеди всех, что надо переписать весь консольный софт.

Почему нельзя заменить связку из иксового эмулятора терминала и терминальной оболочки просто иксовой оболочкой?

Можно. Заменяй. Только сначала ответь, зачем.

Нельзя. Например, попробуй запустить клиент SSH в cmd.exe.

Причём тут cmd.exe? Заменить можно (с переписыванием всего софта под новый интерфейс)? Можно. Всё можно, если очень захотеть. Потому и спрашиваю «зачем» — предположительные плюсы слишком незначительны по сравнению с обретённым геморроем.

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

Я уверен, что уже должен быть такой эмулятор-оболочка. Не один же я такой умный, верно?

с переписыванием всего софта под новый интерфейс

Именно поэтому практически нельзя.

Потому что в эмуляторе терминала геморройно обрабатываются клавиши-модификаторы и чтобы добавить новый хоткей в баш, например, нужно сперва поменять маппинг в эмуляторе терминала (пример: Ctrl+BackSpace не рапознаётся по умолчанию). Как по мне, так эмуляция терминальных последовательностей тут просто лишняя. Мало того что это лишнее звено, так оно ещё и вносит ошибки.

Я уверен, что уже должен быть такой эмулятор-оболочка.

Да, любой эмулятор терминала транслирует «нормальные» хоткеи в символьные последовательности.

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

У тебя никто не забирал такую возможность. Можешь хоть мультимедийные клавиши использовать (я так делал), даже в ядерном TTY (и так тоже делал).

Как по мне, так эмуляция терминальных последовательностей тут просто лишняя.

Если убрать последовательности, то не будет ни ввода, ни вывода, ничего. Иди читай, что такое терминал.

Потому что в эмуляторе терминала геморройно обрабатываются клавиши-модификаторы

На вопрос «зачем» отвечают «чтобы», а «потому что» — на «почему». Это разные виды причинно-следственной связи. Но в данном случае я могу понять в итоге зачем — чтобы тебе было легче замапить Ctrl+Backspace. Таких сочетаний не так много (действительно юзабельных) и большинству они не нужны. Стоит ли это написание целого комбайна (графическая программа со встроенным шеллом, в которую ещё и встроена эмуляция терминала для остального софта)? Если для тебя стоит — пиши. На мой взгляд, то что эмулятор терминала и шелл — отдельные программы — это очень хорошо и юниксвейна, и их объединения в единый комбайн очень не хотелось бы, это приведёт к куче реализаций (сейчас хоть bash как стандарт и zsh с fish как более мощные, ну и tcsh) и вечной несовместимости, при этом будет так, что в одном терминало-шелле нравится минималистичность собственно графического окошка (как в urxvt), а в другом — фичастость встроенного шелла, а перетащить одно в другое можно только переписав. Уж лучше пусть будет «костыль» для Ctrl+Backspace (в итоге ведь получилось сделать как хочется).

Мало того что это лишнее звено, так оно ещё и вносит ошибки.

Будет другое лишнее звено — переключение режимов между «эмулятором терминала» и «оболочкой», что тоже будет вносить ошибки. А ошибок из-за зоопарка плохо совместимых реализаций комбайна может быть ещё больше.

Читайте также:  Как клонировать разделы жесткого диска с windows

Если убрать последовательности, то не будет ни ввода, ни вывода, ничего. Иди читай, что такое терминал.

Насколько я понял, он хочет совместить эмулятор терминала и шелл в один комбайн. При этом чтобы во время ввода команд он работал в одном режиме, а во то время, как на foreground’е находится какая-то программа (ssh, mc, да хоть bash) — в другом (в режиме уже эмуляции терминала как везде). Это вполне реализуемо. Но не стоит того.

Подскажите вчём преимущество zsh перед bash?

  • Правый PROMPT (автоматически скрывается, если перекрывается вводом);
  • Макросы, много макросов (собственно, это кому-то может показаться минусом, так как надо экранировать);
  • Автодополнение умеет разворачивать пути (вводим /h/r/.co/a/r → жмём Tab → получаем /home/r3lgar/.config/awesome/rc.lua );
  • Есть много плюшек;

почему по умолчанию в любом дистрибутиве linux идёт bash а не zsh?

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

Чем тебя не устроило ^W ?

переключение режимов между «эмулятором терминала» и «оболочкой»

О чём ты? Вот смотри. Я запускаю konsole, в нём запускается баш.

Когда я нажимаю Ctrl+Backspace сначала из иксов приходит событие, konsole его транслирует его в терминальную последовательность по выбраннму keytab файлу, потом эта последовательность попадает в bash, который отвечает за ввод обычного текста в терминал.

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

отдельные программы — это очень хорошо и юниксвейна, и их объединения в единый комбайн очень не хотелось бы, это приведёт к куче реализаций (сейчас хоть bash как стандарт и zsh с fish как более мощные)

Я уверен, что от шелла достаточно ввода команд с автодополнением. А скриптниг пусть другие программы выполняют: питон, перл, баш. Разве не юниксвейно? И делается легко. При желании можно даже придумать новый стандарт для автодополнения (D-Bus же внедрили, значит и это реально).

Пример: вот пишешь ты «echo 1 > 1.txt», потом жмёшь Ctrl+Backspace и оболочка моей мечты превращает это в «echo 1 > 1.». Потом жмёшь энтер и баш (или $TERM) это интерпретирует.

Сразу видно ньюфага, который свалил в кучу даже фишки, реализуемые в bash
Вот эта статья более симптоматична https://m.habrahabr.ru/post/82537/

Хочу чтобы ввод текста делался единообразно во всей системе. Например, в иксовых браузере, текстовом редакторе, файловом менеджере это всё делается на Ctrl+Backspace (да даже в винде на работе). А вот ^W в иксах закрывает окно или табу.

Глупо же, что в терминале не такие хоткеи, как в остальной системе.

(Кстати, я поставил Ctrl+C и Ctrl+V на копирование и вставку в эмуляеторе терминала, очень рекомендую.)

Я уверен, что от шелла достаточно ввода команд с автодополнением.

Автодополнение может быть очень разным по фичастости. А скриптинг нужен хотя бы для однострочников.

Пример: вот пишешь ты «echo 1 > 1.txt», потом жмёшь Ctrl+Backspace и оболочка моей мечты превращает это в «echo 1 > 1.».

То есть, ты просто хочешь забиндить Ctrl+Backspace на стандартный ^W (который так и работает, не представляю, как виндузятники без ^W обходятся). Это может сделать и обычный терминал. Тот же urxvt.

на мой взгляд, можно и bash достаточно хорошо настроить, только надо суметь

bash, который отвечает за ввод обычного текста в терминал.

Твоё главное заблуждение. Bash сам работает в эмуляторе и никаких хоткеев не знает.

Хочу чтобы ввод текста делался единообразно во всей системе. Например, в иксовых браузере, текстовом редакторе, файловом менеджере это всё делается на Ctrl+Backspace (да даже в винде на работе). А вот ^W в иксах закрывает окно или табу.

Я тоже хочу, чтобы ввод текста делался единообразно во всей системе. Поэтому у меня и в браузере ^W стирает слово, и в GTK тоже. В Qt правда нет (хз как там настроить это), но на Qt у меня только Hedgewars, а там ввод не нужен, так что не критично. Хотя в итоге это стало причиной использования toxic, а не qTox — со всем смириться могу, но с тем, что в программе, в которой постоянно пишешь текст, не работает ^W привычным образом, нет.

Глупо же, что в терминале не такие хоткеи, как в остальной системе.

ЛОЛШТО? Это в остальной системе не такие хоткеи, как в терминале.

(Кстати, я поставил Ctrl+C и Ctrl+V на копирование и вставку в эмуляеторе терминала, очень рекомендую.)

Сказочный долбо… кхм. Как ты теперь прерывания будешь слать без ^C ?

Источник

Оцените статью