Ответы:
Если ваши скрипты начинаются со строки, #!/bin/bash
они все равно будут запускаться с использованием bash, даже если вашей оболочкой по умолчанию является zsh.
Я обнаружил, что синтаксис zsh очень близок к синтаксису bash, и я не обращал внимания на наличие каких-либо несовместимостей. Я перешел 6 лет назад с bash на zsh без проблем.
.zshrc
#!/bin/bash
будет проигнорирована, если запустить файл сценария, как source ./script.sh
?
#!/usr/bin/env bash
Вместо этого следует использовать , особенно в macOS, где стандартная версия bash сильно устарела, а новые версии практически всегда устанавливаются по другому пути.
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
.
Если функция вызывает другую функцию, другая функция наследует настройку эмуляции, поэтому вам не нужно помещать эту строку во внутренние функции, а только в функции, вызываемые конечным пользователем.
./my_script.sh
. source my_script.sh
и . my_script.sh
будет запускать его как текущую оболочку, игнорируя любой шебанг.
Если шебанг есть, #!/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 имеет много (много) расширений, которые облегчают работу в интерактивном режиме. Это в то же время отличная причина для переключения и проблема:
ls *(.)
(что сложно с другими оболочками). Даже если при взгляде достаточно глубоко ответ становится также сложным в zsh ( print -rl -- *(/)
) .Con zsh:
В конце концов, это ваш выбор, и мне всегда нравится больше вариантов.