Мне любопытно, зачем запускать bash вместо zsh. Я имею в виду, что zsh полностью обратно совместим с bash. Не поймите меня неправильно: мне не нравится bash или что-то в этом роде. Я просто искренне хочу знать, есть ли какие-либо преимущества в его использовании перед zsh.
Так в чем же причина использовать bash вместо zsh?
На ум приходят две причины:
Во-первых, он доступен практически везде. У меня есть несколько систем Linux (в данном случае CentOS 4.x), на которых не установлен zsh. Точно так же я должен коснуться древних систем, таких как Solaris 2.6 и выше, HP-UX 10 и выше, и аналогичных скрипучих версий AIX. Поэтому мне в значительной степени приходится использовать bash на этих компьютерах, что я и делаю, потому что в течение месяца я касаюсь десятков, если не сотен отдельных компьютеров, и чтобы добиться единообразия в своем интерфейсе, вы в конечном итоге застреваете, используя по умолчанию.
Во-вторых, он доступен практически везде. Это означает, что я могу написать сценарий оболочки bash и быть на 99% уверен, что он будет работать при переносе в другое место.
Да, на первый взгляд эти причины одинаковы, но причины для них разные.
Bash обычно входит в состав каждой системы, а zsh - нет. Я люблю zsh, но из-за этого использую zsh для интерактивного использования, но Bash для всех моих сценариев.
Я считаю, что это упрощает все, так как даже когда я покупаю все, что поддерживает bash (setopt SH_WORD_SPLIT?), Я все равно сталкиваюсь с тонкими различиями.
zsh не полностью совместим с bash. Есть множество различий. Более новый zsh более совместим с bash (= ~ поддерживается, exec теперь имеет дополнительные параметры флага и т.д.), но полная совместимость не является целью, даже в рамках «эмуляции».
Например, подстрокой bash является $ {foo: offset: len}, а в zsh - $ foo [начало, конец], и это всего лишь один простой пример.
zsh - это оболочка, на которую влияют tcsh и ksh, которая многое делает по-своему; Совместимость с POSIX явно не является целью, но разработчики реагируют на исправления, которые добавляют параметры / имитируют поведение, приближающее вещи к POSIX. Но когда вы действительно начинаете понимать возможности оболочки, вы начинаете создавать сценарии только для записи, даже больше, чем bash.
bash - это POSIX sh + ksh + педантизм, с некоторыми функциями, скопированными из zsh. В нем тоже есть сценарии только для записи, но поскольку в нем менее мощные операторы, вы не используете краткость zsh и прочего. мощь быть более читаемым (за исключением цитирования, чтобы избежать разделения пробелов, тупой ksh-style $ array означает первый элемент массива, а не все элементы массива и т. д.).
Писать сценарии, которые в полной мере используют возможности любой оболочки, неразумно, если вы не находитесь в ограниченной среде (например, пишете системные сценарии rc, где некоторые FS могут не быть смонтированы, и т. Д.). В идеале используйте Perl / Python / Ruby / что угодно для чего-нибудь достаточно большого, чтобы вам нужна выразительность не в Bourne sh, если вы хотите, чтобы другие могли поддерживать это. Сохраните материал оболочки для вещей, связанных с интерактивной оболочкой (программирование завершения табуляции и т. Д.).
Я бы не стал использовать bash вместо zsh. Я бы использовал голый sh поверх zsh для простых скриптов или переключился на язык, где ассоциативные массивы имеют достойные операторы (в отличие от zsh, где они, опять же, «краткие»). я мощь переключите сценарий sh на bash, если мне нужна эта маленькая функция для расширения существующего проверенного сценария, и у меня нет времени переписывать его сейчас.
Мой совет: если вы стремитесь к абсолютной переносимости, пишите, используя правила оболочки Bourne, даже не беспокойтесь о расширениях оболочки Korn. Как уже упоминалось, это старые «большие коробки», на которых вообще нет оболочек GNU.
Баш уже делает «слишком много». У меня есть друг на работе, который предпочитает zsh, но я не знаю, что именно он делает.
В любом случае, либо напишите для оболочки Bourne (или «bourne again»), либо, альтернативно, если вы делаете собственный сценарий для небольшого количества конкретных ящиков, полностью пропустите «ад оболочки» и просто напишите, используя perl или python (или что-то еще ваш любимый локально установленный интерпретатор).
В дополнение к приведенной выше причине переносимости, еще одна может заключаться в том, что bash все еще добавляет функции.
Например bash v4.x + введено:
рекурсивное глобирование:
rm -f ** / *. журнал
autocd:
Введите "/ tmp" вместо "cd / tmp"
Кстати, вам много раз здесь говорили, что bash можно найти практически везде, поэтому используйте его для написания переносимых скриптов, что неверно.
Ерунда. Если вы знаете, что каждая система, которая вам интересна, имеет BASH, это вполне разумное утверждение. BASH имеет множество полезных функций, которые невозможно эмулировать в POSIX sh. Легкомысленное использование функций, отличных от POSIX, - не лучшая идея, но использовать их, когда они вам действительно нужны, - это нормально.
Переносимость не абсолютна. Это спорно, насколько далеко вы должны принять его, так же как и все остальное. Например, Fedora использует команды оболочки для создания пакетов RPM, а в рекомендациях по упаковке Fedora указано, что, поскольку все пакеты должны быть изначально созданы на Fedora, можно использовать все функции BASH. Хотя теоретически другие дистрибутивы без BASH могут захотеть повторно использовать свои исходные RPM, они приняли решение о переносимости, основываясь на практичности, а не на вашей мантре «ВСЕГДА ИСПОЛЬЗУЙТЕ POSIX !! 1».
ZSH не прижился как оболочка по умолчанию просто потому, что это беспорядок из недоработанных идей.
Кстати, вам здесь много раз говорили, что bash
встречается практически везде, поэтому используйте его для написания переносимых скриптов, что ложно.
Правильный способ написания переносимых скриптов unix - использовать sh
, который находится в каждой системе * nix.
Все остальные оболочки, кроме sh
это просто ваш ежедневный интерактивный инструмент.
Приезжая в bash
против zsh
- bash
входит в комплект *nixes
чем zsh
, так что здесь возникают недостатки установки дополнительного программного обеспечения в систему - вы должны поддерживать его. Некоторым людям нравятся "крутые функции" zsh, поэтому им нравится платить эту цену, а некоторым нет.
Другой момент:
Многие программы по умолчанию обеспечивают классное завершение bash. Для меня это причина не переключаться.
[добавлено в июле 2013 г.] После нескольких лет использования zsh с момента вышеприведенного комментария я должен сказать, что завершение табуляции (даже встроенное, без модификаций третьей стороны) великолепно и похоже, что оно намного превосходит то, что предлагает bash . :).