Існує кілька програм, які реалізують мову мови /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немає ніяких очікувань, що ці сценарії працюватимуть над іншим дистрибутивом).
==це має бути=. Це та що змінні розширення повинні бути подвійними.