Чи всі баш скрипти сумісні з `zsh`?


63

Я хочу перейти з bash на zsh, але стурбований сумісністю bash-скриптів.

Чи всі сценарії / функції bash сумісні з zsh? Отже, якщо це правда, це zsh просто вдосконалення для bash?


Я вважаю це корисним: askubuntu.com/questions/1577/moving-from-bash-to-zsh
chrisjlee

Відповіді:


55

Якщо ваші сценарії починаються з рядка, #!/bin/bashвони все одно будуть запускатися з використанням bash, навіть якщо ваша оболонка за замовчуванням zsh.

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


1
Що було вашою найскладнішою частиною переходу?
chrisjlee

4
Немає. Мої особисті сценарії додають належне посилання на bash, і я знайшов хороший .zshrc для початку. Zsh і bash були досить схожими, що я насправді не вважав це складним.
Гюйгенс

4
ви можете перелічити ваш .zshrc:)
неаумузичний

Але якщо рядок #!/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

Якщо 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 має багато (безліч) розширень, які полегшують інтерактивну роботу. Це в той же час відмінний привід для переключення і проблема:

  1. Про зш

    • Дуже приємно бачити параметри синтаксису команд, натискаючи вкладку.
    • Ще одна основна перевага zsh - це виправлення помилок під час друку. Замість того, щоб просто помилка відображення: команда не знайдена, zsh спробує інтерпретувати те, що ви намагалися ввести. zsh прийме цей вхід як дійсну команду.
    • Також zsh має багато модифікаторів розширень, які дозволяють отримати широкий спектр рішень. Як: список лише файлів: ls *(.)(що з іншими оболонками складно). Навіть якщо при погляді достатньо глибоко відповідь стає також складним у zsh ( print -rl -- *(/)) .
    • Прийміть математику з поплавцями (з деякими застереженнями).
  2. Con zsh:

    • Bash - оболонка за замовчуванням у багатьох інших системах.
    • Багато параметрів zsh не допомагають безпосередньо писати bash сумісні сценарії.
    • Це навіть може стати великою проблемою, намагаючись вивчити дві оболонки одночасно.

Зрештою, це ваш вибір, і, мені завжди подобається більше варіантів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.