Все ли bash-скрипты совместимы с `zsh`?

63

Я хочу перейти от bash к zsh, но обеспокоен совместимостью сценариев bash.

Все ли скрипты / функции bash совместимы с zsh? Следовательно, если это правда, zsh - это просто улучшение bash?

chrisjlee
источник
Я нашел это полезным: askubuntu.com/questions/1577/moving-from-bash-to-zsh
chrisjlee

Ответы:

56

Если ваши скрипты начинаются со строки, #!/bin/bashони все равно будут запускаться с использованием bash, даже если вашей оболочкой по умолчанию является zsh.

Я обнаружил, что синтаксис zsh очень близок к синтаксису bash, и я не обращал внимания на наличие каких-либо несовместимостей. Я перешел 6 лет назад с bash на zsh без проблем.

Гюйгенс
источник
1
Какова была ваша самая сложная часть перехода?
chrisjlee
4
Никто. Мои личные сценарии добавляют правильную ссылку на bash, и я нашел хороший .zshrc для начала. Zsh и bash были достаточно похожи, и я не нашел в этом ничего особенного.
Гюйгенс
4
.zshrc
Можете
1
Но если строка #!/bin/bashбудет проигнорирована, если запустить файл сценария, как source ./script.sh?
LCB
3
Жесткое кодирование пути к оболочке - плохой совет, даже если это делается часто. #!/usr/bin/env bashВместо этого следует использовать , особенно в macOS, где стандартная версия bash сильно устарела, а новые версии практически всегда устанавливаются по другому пути.
Конрад Рудольф
29

Zsh может запускать большинство сценариев Bourne, POSIX или ksh88, если вы переведете его в правильный режим эмуляции ( emulate shили emulate ksh). Он не поддерживает все функции bash или ksh93. Zsh имеет большинство функций bash, но во многих случаях с другим синтаксисом.

Оболочка, которую вы используете в интерактивном режиме, не имеет значения для любого имеющегося у вас скрипта Оболочка, которая запускает сценарии, - это оболочка, указанная в первой строке, строка shebang . Например, если скрипт начинается с #!/bin/bash, он будет выполнен bash.

Если вы настроили bash, вы не сможете просто переименовать его .bashrcв .zshrc. Некоторые вещи могут быть общими, например псевдонимы и функции, если вы придерживаетесь пересечения между двумя оболочками (пересечение близко к ksh88 и pdksh ). Другие вещи, такие как настройки приглашения, функции завершения и большинство параметров, должны быть полностью переписаны.

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

if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi

Вы можете использовать emulate shвместо того, emulate kshчтобы быть ближе к обычному синтаксису sh, который вам нужен .profile.

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

Жиль "ТАК - перестань быть злым"
источник
1
Используемая вами оболочка не имеет значения, если вы запускаете свои скрипты как ./my_script.sh. source my_script.shи . my_script.shбудет запускать его как текущую оболочку, игнорируя любой шебанг.
BallpointBen
3

Если шебанг есть, #!/bin/bashи вы запускаете скрипт, так как ./scriptскрипт будет выполняться bash. Абсолютно без проблем здесь.

Однако, если вы выполняете zsh ./scriptили отправляете его . ./scriptна работающий экземпляр zsh, довольно часто синтаксис bash и zsh не будет совпадать.

Например, zsh не разделяет расширения параметров по умолчанию, в bash есть встроенная справка, read -p promptв zsh ее нет (синтаксис сильно отличается: , arrays start on 1 (not 0) in zsh,команда read read cmd \? only search for external commands in zsh, or there is no (simple) equivalent to$ {Foo ^} `(только первый символ в верхнем регистре) в zsh Среди прочего, это длинный список (в основном) сходств и некоторых отличий .

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

Тем не менее, zsh имеет много (много) расширений, которые облегчают работу в интерактивном режиме. Это в то же время отличная причина для переключения и проблема:

  1. Про зш

    • Очень приятно видеть параметры синтаксиса команд, нажимая на вкладку.
    • Еще одно важное преимущество zsh - исправление ошибок при опечатке. Вместо того, чтобы просто отображать ошибку: команда не найдена, zsh попытается интерпретировать то, что вы пытались ввести. Zsh примет этот ввод как допустимую команду.
    • Кроме того, в zsh есть много модификаторов расширений, которые допускают широкий спектр решений. Нравится: список только файлов: ls *(.)(что сложно с другими оболочками). Даже если при взгляде достаточно глубоко ответ становится также сложным в zsh ( print -rl -- *(/)) .
    • Принимать математику с поплавками (с некоторыми оговорками).
  2. Con zsh:

    • Bash является оболочкой по умолчанию во многих других системах.
    • Многие параметры zsh не помогают писать сценарии, совместимые с bash.
    • Это может даже стать большой проблемой, если попытаться выучить две оболочки одновременно.

В конце концов, это ваш выбор, и мне всегда нравится больше вариантов.

Исаак
источник