Есть ли причина использовать bash вместо zsh? [закрыто]

33

Мне любопытно, почему можно использовать bash вместо zsh. Я имею в виду, что zsh полностью обратно совместим с bash. Не поймите меня неправильно: мне не нравится Баш или что-то еще. Я просто искренне хочу знать, есть ли какие-либо преимущества использования его по сравнению с Zsh.

Так какая причина использовать bash вместо zsh?

Джейсон Бейкер
источник
2
Просто хотел отметить, что ZSH не полностью обратно совместим с BASH. В ZSH индексация массива начинается с 1 - в BASH индексация массива начинается с 0. Также есть и другие отличия, но я хотел бы указать на это.
Чарльз Аддис

Ответы:

29

На ум приходят две причины:

Первое - это доступно практически везде. У меня есть несколько систем Linux (в данном случае CentOS 4.x), на которых не установлена ​​zsh. Точно так же я должен коснуться древних систем, таких как Solaris 2.6 и выше, HP-UX 10 и выше, и аналогично скрипучих версий AIX. Поэтому мне в значительной степени приходится использовать bash на этих компьютерах, что я и делаю, потому что в течение месяца я касаюсь десятков, если не сотен, отдельных компьютеров, и чтобы добиться согласованности в вашем интерфейсе, вы в конечном итоге застряли, используя по умолчанию.

Второе - это доступно практически везде. Это означает, что я могу написать скрипт оболочки bash и быть на 99% уверенным, что он будет работать при переносе в другое место.

Да, эти причины внешне одинаковы, но причины их различны.

Дэвид Макинтош
источник
2
Я помню, что на HPUX имелись ksh88 / ksh93, у нас никогда не было доступа к установке bash.
Zlemini
24

Bash обычно поставляется с каждой системой, а Zsh - нет. Я люблю zsh, но из-за этого я использую zsh для интерактивного использования, но Bash для всех моих сценариев .

Я нахожу, что это делает все проще, потому что даже когда я покупал все, что совместимо с bash (setopt SH_WORD_SPLIT?), Я все еще сталкиваюсь с небольшими различиями.

Кайл Брандт
источник
3
Это будет любая система GNU / Linux, которую вы имеете в виду?
Андол
2
Ну, я обнаружил, что он поставляется с OS / X и BSD, у меня нет большого опыта работы с другими * nix, разве они (последние версии) обычно не имеют bash?
Кайл Брандт
1
Старые версии Solaris не включали bash; Мне обычно приходилось полагаться на то, что Борн является оболочкой для сценариев. Некоторое время это не имело место, но вы все равно можете столкнуться с этим на некоторых крупных предприятиях.
user5336
3
Должны быть разные BSD: s тогда. По крайней мере, в OpenBSD и во FreeBSD вы должны устанавливать bash отдельно от портов / пакетов.
Андол
andol: Это те, которые я использовал .. Я должен помнить неправильно, или я сделал это и просто не помню.
Кайл Брандт
13

Zsh не полностью совместим с Bash. Есть множество отличий. Более новый zsh более совместим с bash (= ~ поддерживается, exec теперь имеет дополнительные опции флагов и т. Д.), Но полная совместимость не является целью, даже в разделе «emulate».

Например, подстрока bash - это $ {foo: offset: len}, но в zsh это $ foo [start, end], и это всего лишь один простой пример.

zsh - это оболочка, на которую влияют tcsh и ksh, которая делает многие вещи по-своему; Совместимость с POSIX явно не является целью, но разработчики реагируют на патчи, которые добавляют параметры / эмулируют поведение, приближающее POSIX. Но когда вы действительно начинаете понимать мощь оболочки, вы начинаете создавать сценарии только для записи, даже больше, чем bash.

bash - это POSIX sh + ksh + pedanticism, некоторые функции теперь скопированы из zsh. Он также имеет сценарии только для записи, но поскольку он имеет менее мощные операторы, вы в конечном итоге не используете краткость zsh, и все может быть более читабельным (за исключением всех кавычек, чтобы избежать разделения пробелов, глупый массив $ ksh-style означает сначала -элемент-массив, не все-элементы-массив и т. д. и т. д.).

Написание сценариев, которые в полной мере используют возможности любой оболочки, нецелесообразно, если только вы не находитесь в стесненной среде (например, написание системных rc-сценариев, где некоторые FS могут быть не смонтированы и т. Д.). В идеале, используйте Perl / Python / Ruby / что угодно для чего-то достаточно большого, чтобы вам нужна выразительность не в Bourne sh, если вы хотите, чтобы другие могли ее поддерживать. Сохраняйте содержимое оболочки для вещей, относящихся к интерактивной оболочке (программирование завершения вкладок и т. Д.).

Я бы не использовал Bash над Zsh. Я бы использовал голый sh над zsh для простых сценариев или переключился бы на язык, где ассоциативные массивы имеют достойные операторы (в отличие от zsh, где они, опять же, «кратки»). Я мог бы переключить сценарий sh на bash, если мне нужна эта небольшая функция для расширения существующего проверенного сценария, и у меня нет времени переписывать его сейчас.

Фил П
источник
6
NB: $ {Foo: смещение: Len} в настоящее время поддерживается в Zsh, для совместимости.
Фил П
6

Мой совет: если вы стремитесь к абсолютной переносимости, пишите с использованием правил оболочки Bourne, даже не думайте о расширениях оболочки Korn. Как уже упоминалось, это старые «большие коробки», на которых вообще нет оболочек GNU.

Баш уже делает "слишком много". У меня есть друг на работе, который предпочитает Zsh, но я не знаю, что именно он делает.

В любом случае, либо пишите для оболочки Bourne (или «Bourne again»), либо поочередно, если вы делаете собственный сценарий для небольшого числа конкретных блоков, полностью пропустите «shell hell» и просто пишите, используя perl или python (или любой другой ваш любимый локально установленный переводчик есть).

Roboprog
источник
5

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

Например, bash v4.x + представил:

  • рекурсивное сглаживание:

    rm -f ** / *. log

  • autocd:

    Наберите "/ tmp" вместо "cd / tmp"

кавалькада
источник
2
Как функции копирования bash из zsh являются причиной использования bash?
qqx
5

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

Ерунда. Если вы знаете, что в каждой вашей системе есть BASH, это вполне разумное утверждение. BASH имеет много полезных функций, которые нельзя разумно эмулировать в POSIX sh. Легкомысленное использование функций, отличных от POSIX, не является хорошей идеей, но использовать их, когда они вам действительно нужны, вполне нормально.

Переносимость не является абсолютной. Можно утверждать, как далеко вы должны взять это, как и все остальное. Например, Fedora использует команды оболочки для сборки пакетов RPM, а в рекомендациях по пакетированию Fedora говорится, что, поскольку все пакеты должны быть собраны непосредственно в Fedora, можно использовать все функции BASH. Хотя теоретически другие дистрибутивы без BASH, возможно, захотят повторно использовать свои исходные RPM-пакеты, они приняли решение о переносимости на основе практичности, а не вашей «ВСЕГДА UZE POSIX !! 1» мантры.

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

Craig
источник
2
Можете ли вы объяснить, какие функции или идеи в zsh вы считаете недоделанными и почему?
Funroll
2

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

Правильный способ написания переносимых сценариев Unix - это использование sh, которое встречается в каждой системе * nix .

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

Когда вы переходите на bashvs zsh- bashвходит в комплект более *nixesчем zsh, поэтому возникают недостатки установки дополнительного программного обеспечения в систему - вы должны поддерживать его. Некоторые люди любят Zsh "крутые функции", поэтому они любят платить эту цену, а некоторые нет.

Самат
источник
2
Многие современные реализации sh - это просто ссылки на bash.
user9517 поддерживает GoFundMonica
2
@ Iain Ubuntu по умолчанию использует dash , и даже если shэто bash, он активирует режим совместимости при запуске как sh.
Mgorven
2

Еще один момент:

Многие программы обеспечивают классное завершение bash по умолчанию. Для меня это причина не переключаться.

[добавлено в июле 2013 года] После нескольких лет использования zsh после комментария выше, я должен сказать, что завершение табуляции (даже встроенное, без модификаций 3-й части) блестяще и выглядит так, как будто оно намного превышает предложенное bash. , :).

Войцех Качмарек
источник
3
Я думаю, что это работает и с ZSH, с завершением табуляции в ZSH, я получаю множество аргументов, специфичных для программы ...
Кайл Брандт
Интересный. Вы говорите, что файлы завершения bash работают с zsh, или просто некоторые программы имеют специфичные для zsh вещи завершения? Тем не менее, существует некоторая стандартная компоновка файлов завершения bash, которые zsh может рассматривать или не учитывать автоматически. Вы внесли изменения в конфигурацию zsh, чтобы она работала?
Войцех Качмарек
@Wojciech Kaczmarek: Я думаю, что вы хотите 19.3 из следующего: zsh.sourceforge.net/Doc/Release/zsh_19.html . Честно говоря, я никогда не тратил время на то, чтобы по-настоящему понять это, просто сорвал .zshrc, который я нашел в Интернете :-) Но он завершит аргументы командной строки из таких программ, как apt, grep и т.д ....
Кайл Брандт,
5
Завершение табуляции в bash очень похоже на старую систему дополнения табов в zsh. Это одна из идей, скопированных из zsh в bash (есть другие, скопированные из bash в zsh). Вы можете использовать сценарии завершения, написанные для bash в zsh, запустив "bashcompinit" и затем используя команды "complete" и / или "compgen" внутри zsh - это возможно, потому что функциональность bash является подмножеством функций, доступных в zsh и так можно подражать. Поэтому нет причин переключаться на bash, потому что команда поставляется с завершением bash.
Фил П