Відповіді:
Якщо ваші сценарії починаються з рядка, #!/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
запустить її як поточну оболонку, ігноруючи будь-який шебанг.
Якщо shebang є, #!/bin/bash
і ви запустите скрипт, оскільки ./script
сценарій буде виконуватися bash. Тут абсолютно немає проблем.
Однак, якщо ви виконаєте zsh ./script
або виведете його . ./script
на запущений екземпляр zsh, цілком часто зустрічається, що синтаксис bash та zsh не збігається.
Наприклад, zsh не розбиває розширення параметрів за замовчуванням, у bash є вбудована довідка, немає read -p prompt
в zsh (синтаксис сильно відрізняється, читає cmd \? Prompt , arrays start on 1 (not 0) in zsh,
команду only search for external commands in zsh, or there is no (simple) equivalent to
$ {foo ^} `(верхній регістр лише перший символ) у zsh Це, серед іншого, довгий перелік (в основному) подібності та деяких відмінностей .
У деяких випадках zsh може бути запропоновано імітувати інші оболонки. У деяких випадках неможливий загальний синтаксис, що переноситься на обидва оболонки (без використання псевдонімів або функцій для емуляції портативних рішень).
Однак zsh має багато (безліч) розширень, які полегшують інтерактивну роботу. Це в той же час відмінний привід для переключення і проблема:
ls *(.)
(що з іншими оболонками складно). Навіть якщо при погляді достатньо глибоко відповідь стає також складним у zsh ( print -rl -- *(/)
) .Con zsh:
Зрештою, це ваш вибір, і, мені завжди подобається більше варіантів.