Если ваши скрипты начинаются со строки, #!/bin/bashони все равно будут запускаться с использованием bash, даже если вашей оболочкой по умолчанию является zsh.
Я обнаружил, что синтаксис zsh очень близок к синтаксису bash, и я не обращал внимания на наличие каких-либо несовместимостей. Я перешел 6 лет назад с bash на zsh без проблем.
Никто. Мои личные сценарии добавляют правильную ссылку на 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.
Если функция вызывает другую функцию, другая функция наследует настройку эмуляции, поэтому вам не нужно помещать эту строку во внутренние функции, а только в функции, вызываемые конечным пользователем.
Используемая вами оболочка не имеет значения, если вы запускаете свои скрипты как ./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 имеет много (много) расширений, которые облегчают работу в интерактивном режиме. Это в то же время отличная причина для переключения и проблема:
Очень приятно видеть параметры синтаксиса команд, нажимая на вкладку.
Еще одно важное преимущество zsh - исправление ошибок при опечатке. Вместо того, чтобы просто отображать ошибку: команда не найдена, zsh попытается интерпретировать то, что вы пытались ввести. Zsh примет этот ввод как допустимую команду.
Ответы:
Если ваши скрипты начинаются со строки,
#!/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. Поместите весь код в функции и поместите следующую строку вверху каждой функции:Вы можете использовать
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:
В конце концов, это ваш выбор, и мне всегда нравится больше вариантов.
источник