Коли мова йде про сценарії оболонки в Unix-подібних операційних системах, домінують дві оболонки: Bash (Bourne Again Shell) і Zsh (Z Shell). Якщо ви програміст або системний адміністратор, вибір між цими двома суттєво впливає на вашу ефективність і продуктивність.
Розуміння відмінностей і подібностей між цими двома оболонками допоможе вам оптимізувати робочий процес командного рядка. Знання про нюанси кожної оболонки допоможе вам приймати зважені рішення.
Що таке Bash і Zsh?
Bash популярний у системах Linux і macOS. Це потужний інструмент, який можна використовувати для взаємодії з операційною системою та виконання команд. Ви також можете використовувати Bash для сценаріїв оболонки, які автоматизують завдання шляхом написання сценаріїв, що містять більше однієї команди.
Zsh (оболонка Z) — це розширена версія Bash, яка має набагато більше функцій. Це оболонка за замовчуванням у macOS. Він також стає все більш популярним у системах Linux.
Як переключитися з Bash на Zsh
Якщо ви користуєтеся системою Linux і бажаєте перейти на Zsh, для початку встановіть його за допомогою менеджера пакетів. Наприклад, у Debian або Ubuntu скористайтеся такою командою:
sudo apt install zsh
Після встановлення у вашій системі перейдіть до нього, виконавши таку команду:
chsh -s $(which zsh)
Якщо ви використовуєте macOS, Zsh уже встановлено. Щоб перейти до нього, виконайте таку команду:
chsh -s /bin/zsh
Щоб повернутися до Bash, замініть Zsh на Bash у наведених вище командах.
Щоб перевірити, яку оболонку ви використовуєте, виконайте таку команду:
echo $SHELL
Це допоможе вам підтвердити, що ви використовуєте ту оболонку, яку ви мали намір.
Відмінності між Zsh і Bash
Є кілька відмінностей між Zsh і Bash. Розгляд цих відмінностей допоможе вам вирішити, яка оболонка вам найкраще підходить.
1. Швидке налаштування
Zsh пропонує простіший спосіб налаштування підказок за допомогою керуючих послідовностей на основі %. Це дозволяє використовувати динамічні підказки з кольором та інформацією. Щоб налаштувати підказку оболонки, визначте PS1 (основний запит).
PS1="%F{green}%n@%m %F{blue}%~ %f$ "
Наведене вище спеціальне підказка відображає ім’я користувача, ім’я хоста та поточний каталог різними кольорами:
Є багато інших способів налаштувати підказку Zsh, що дозволяє встановити індикатор адміністратора, включити дату й час і зберегти нове підказку.
Bash використовує дещо інший підхід, коли мова йде про швидке налаштування. Він використовує escape-коди, щоб указати зміни кольору та форматування в підказці. Щоб досягти таких самих налаштувань, як у Zsh вище, ви можете скористатися наступним спеціальним запитом.
PS1="\[\033[32m\]\u@\h \[\033[34m\]\w \[\033[0m\]\$ "
Використання \[\033[0m\] дуже важливий, оскільки він гарантує, що зміни кольору не впливають на текст, який слідує за підказкою.
2. Підтримка асоціативних масивів
Zsh нативно підтримує асоціативні масиви. Ці масиви забезпечують зручний спосіб асоціювати дані, що полегшує впорядкування та пошук інформації. Використовуйте команду declare -A, щоб явно оголосити асоціативний масив:
# Declare an associative array in Zsh
declare -A my_assoc_array
Потім ви можете призначити значення асоціативному масиву:
my_assoc_array=(key1 value1 key2 value2)
І, нарешті, отримати доступ до значень за допомогою їхніх ключів:
echo $my_assoc_array[key1] # Outputs: value1
Bash включає власну підтримку асоціативних масивів, починаючи з версії 4.0. Ви оголошуєте та призначаєте значення так само, як і в Zsh. Але коли мова йде про доступ до значень масиву, вам потрібно загорнути ключ у фігурні дужки:
echo "${my_assoc_array[key1]}"
Основна відмінність полягає в тому, що Zsh підтримує асоціативні масиви більш багатофункціональним і розширеним, ніж Bash. Zsh дозволяє асоціативним масивам мати ключі різних типів даних, а не лише рядки. Bash підтримує лише рядкові ключі.
У попередніх версіях Bash вам потрібно було знайти спосіб вирішення проблеми або мати зовнішні інструменти для використання асоціативних масивів.
3. Розширені шаблони глоббування
Розширені шаблони глоббування забезпечують потужний і гнучкий спосіб вибору файлів і каталогів і керування ними на основі різних критеріїв. Вони корисні, коли ви працюєте зі складними структурами файлів або коли вам потрібен точний контроль над вибором файлів.
У сценарії Zsh ви можете ввімкнути ці шаблони за допомогою команди setopt. Наприклад, щоб зіставити всі файли .txt у поточному каталозі:
setopt extended_glob
txt_files=(*.txt)
Щоб зіставити всі файли, крім файлів із розширенням .log:
setopt extended_glob
non_log_files=^(*.log)
У Bash вам потрібно ввімкнути їх за допомогою команди shopt із опцією extglob. Наприклад, щоб зіставити всі файли .txt у поточному каталозі:
shopt -s extglob
txt_files=(*.txt)
Щоб зіставити всі файли, крім файлів із розширенням .log:
shopt -s extglob
non_log_files=!(*.log)
Основна відмінність між Zsh і Bash, коли справа доходить до шаблонів глоббування, полягає в команді, яка використовується для їх увімкнення. Однак зауважте, що деякі оператори відрізняються між двома оболонками.
4. Розширене розширення параметрів
Zsh підтримує непряме розширення параметрів. Це дозволяє розширити значення змінної, ім’я якої зберігається в іншій змінній. Щоб досягти цього, вам потрібно поставити перед назвою змінної знак оклику !.
name="foo"
result="${!name}"
echo "$result"
З іншого боку, Bash не допускає непрямого розширення нативно. Обхідним шляхом для цього є використання вбудованої команди eval або синтаксису ${!var} для непрямих посилань на змінні.
name="world"
var="name"
echo ${!var} # This will output: world
Подібності між Bash і Zsh
Хоча між Bash і Zsh є відмінності, вони також мають певну схожість.
1. Синтаксис командного рядка
Bash і Zsh мають схожий синтаксис командного рядка. Це чудово, оскільки це означає, що більшість команд і сценаріїв, які ви пишете, працюватимуть у будь-якій оболонці без змін. Zsh побудований на основі Bash, тому він містить усі ті самі основні команди та функції.
Однак є дуже незначні відмінності в синтаксисі, які вам потрібно буде визначити та скорегувати.
2. Послідовність підстановки команд
Підстановка команд – це процес вбудовування виводу однієї команди в іншу. Це узгоджується між обома оболонками.
result=$(ls)
І в Bash, і в Zsh ви можете використовувати синтаксис $(command), щоб замінити вихід команди на змінну. Це дозволяє легко переносити сценарії між двома оболонками.
3. Параметр налагодження сценарію
І Bash, і Zsh використовують прапорець -x для налагодження сценарію. Коли ви запускаєте сценарій із цим прапорцем, він відображає кожну команду перед її виконанням. Це допоможе вам визначити проблеми у ваших сценаріях.
# Debugging a script in both Bash and Zsh
#!/bin/bash -xecho "Debugging Bash script"
У цьому сценарії Bash прапорець -x вмикає налагодження. Подібний підхід можна використовувати в Zsh; просто замініть bash на zsh.
Міркування щодо вибору між Zsh і Bash
- Сумісність і портативність: Bash є оболонкою за замовчуванням у багатьох системах на основі Unix. Це робить його безпечнішим вибором для міжплатформних сценаріїв. Якщо вам потрібно, щоб ваші сценарії запускалися на багатьох системах без змін, Bash є кращим варіантом.
- Складність сценарію та розширені функції: Zsh надає такі розширені функції, як асоціативні масиви, розширені шаблони глоббування та розширене розширення параметрів. Це спрощує складні сценарії. Якщо ваші сценарії вимагають розширеної обробки рядків або структур даних, Zsh є кращим вибором.
- Спільнота та екосистема плагінів: і Bash, і Zsh мають активні спільноти, але Zsh має сильнішу спільноту та розгалужену екосистему плагінів і тем. Якщо ви цінуєте налаштування, активна спільнота Zsh і підтримка плагінів можуть бути значною перевагою.
- Легкість навчання: якщо ви новачок у сценаріях оболонки, Bash є більш доступною відправною точкою. Він містить обширну документацію та ресурси, доступні для початківців. Це полегшує вивчення основ сценаріїв оболонки.
Автоматизація завдань за допомогою сценаріїв оболонки
Дуже важливо знати, як автоматизувати завдання за допомогою сценаріїв оболонки. Ви можете автоматизувати повторювані завдання та заощадити багато часу.
Ви також можете використовувати ці сценарії для керування обліковими записами користувачів, моніторингу системних ресурсів, резервного копіювання даних і виконання планового обслуговування. Якщо вони ретельно написані, вони також можуть зменшити ймовірність людської помилки.