Існує кілька програм, які реалізують мову мови /bin/sh
. У Ubuntu - /bin/sh
це тире, призначене для швидкого використання невеликої кількості пам'яті, і не підтримує набагато більше, ніж очікується мінімум /bin/sh
. На RHEL - /bin/sh
це bash, який повільніше і використовує більше пам'яті, але має більше функцій. Однією з таких особливостей є ==
оператор [
умовного синтаксису. Dash підтримує [
, що є основною функцією sh, але він не має ==
оператора, який є розширенням bash (і ksh і zsh).
Ви можете переключити вашу систему на використання bash. У Ubuntu /bin/sh
- це символічне посилання на dash
. Ви можете bash
замість цього зробити символічне посилання . Поточні версії Debian і Ubuntu (і похідних) роблять це варіантом установки тире. Щоб змінити його, запустіть
sudo dpkg-reconfigure dash
і відповісти "так", щоб тире як /bin/sh
"ні" не переходило на баш.
Ви можете тримати bash як /bin/sh
, але це зробить вашу систему трохи повільніше. Можна навіть уявити, що якийсь системний скрипт несумісний з bash, хоча це малоймовірно, оскільки bash - це здебільшого суперсет тире.
Для дистрибутивів, у яких немає інтерфейсу для вибору між реалізаціями /bin/sh
, ось як перейти на bash.
sudo ln -s bash /bin/sh.bash
sudo mv /bin/sh.bash /bin/sh
Тримайте термінал відкритим і переконайтеся, що sh
після цього ще можна виконати деякі сценарії. Якщо ви зіпсуєте цю команду, це зробить вашу систему непридатною. (До речі, причиною того, що я скористався декількома командами вище, а не прямолінійними, sudo ln -sf bash /bin/sh
є те, що ln -sf
це не атомно. У певному випадку, коли ваш комп'ютер під час цієї операції вийшов з ладу, вам потрібно буде відновити його з рятувальних носіїв. Навпаки, mv
є атомним.)
Щоб відновити тире як /bin/sh
:
sudo ln -s dash /bin/sh.dash
sudo mv /bin/sh.dash /bin/sh
Зауважте, що якщо sh /bin/bash
за замовчуванням у вашому розповсюдженні, перехід на тире може спричинити збій сценаріїв, оскільки bash має набагато більше функцій, ніж тире. Сценарії Bash повинні починатися з #!/bin/bash
, а сценарії, починаючи з, #!/bin/sh
не повинні використовувати специфічні для bash функції, але дистрибутиви, які постачаються з bash, /bin/sh
можуть використовувати функції bash у #!/bin/sh
сценаріях, специфічних для цього дистрибутива (це нормально, доки не очікується, що користувачі може переключитися на тире, оскільки /bin/sh
немає ніяких очікувань, що ці сценарії працюватимуть над іншим дистрибутивом).
==
це має бути=
. Це та що змінні розширення повинні бути подвійними.