Відповіді:
Якщо ваші сценарії починаються з рядка, #!/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:
Зрештою, це ваш вибір, і, мені завжди подобається більше варіантів.