Як використовувати Bash для sh в Ubuntu


14

Я встановлюю величезну програму, яка має свої ресурси як rpmфайл. Він застряг на лінії

#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]

Мабуть, shпрацюйте bashв Red Hat Linux з цим синтаксисом, але це дає помилку unexpected operatorв Ubuntu.

Я не можу змінити сценарій, bashоскільки сценарій походить із rpmпакета. Я можу витягнути і перепакувати rpmпакунок, але таких сценаріїв може бути багато.

Чи є спосіб змінити за замовчуванням оболонки так, щоб трактувати #!/bin/shяк bashабо щось інше, що може працювати з [оператором?


5
Єдине, що не так - ==це має бути =. Це та що змінні розширення повинні бути подвійними.
Кусалаланда

4
[- це не оператор, а вбудована команда, яка викликається test. Несподіваний оператор є, ==і його слід замінити, =оскільки він не сумісний з POSIX.
шилі

Друге єдине, що помиляється, - це те, що $SCITEGICPERLHOMEслід цитувати.
l0b0

12
Вам слід подати скаргу автору програми. Якщо вони використовують #!/bin/sh, вони повинні переконатися, що вони використовують лише функції оболонки POSIX, а не bashрозширення. Цей програміст дуже неохайний. Він повинен або виправити свій код, або використовувати #!/bin/bash.
Бармар

Для людей, які цікавляться іншими подібними проблемами, ось список " башизмів ". Дивіться також це питання .
Людина капітана

Відповіді:


21

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


На мій не настільки скромний погляд, якщо якийсь скрипт виходить з ладу, коли /bin/shце Bash, це помилка або в системі (пакет із сценарієм), або в sh-mode Bash . Як каже Стівен, система явно дозволяє /bin/shповернути Bash, через dpkg-reconfigure. Також згадується як можливість у вікі Ubuntu з цього приводу: wiki.ubuntu.com/DashAsBinSh
ilkkachu

5
@ilkkachu Так, якщо сценарій не працює, якщо /bin/shбаш, це помилка. Однак помилки трапляються. Я рекомендую дотримуватися стандартних умов, якщо ви не здатні та не бажаєте діагностувати такі помилки, оскільки інші люди перевірили це на вас. Я використовував тире, як і /bin/shраніше, коли він офіційно підтримувався на Debian, але це був ризик, який я взяв на себе, знаючи, що зможу впоратися, якщо щось трапиться.
Жил "ТАК - перестань бути злим"

Зауважте, що переменені вручну символьні посилання будуть відновлені до будь-якої конфігурації, що зберігається під debconfчас наступного dashоновлення; правда, це не буде часто (якщо взагалі в даному випуску) для систем, на яких працює Debian стабільно.
Стівен Кітт

36

Щоб перейти shна bash(замість dash, за замовчуванням), переконфігуруйте dash(так, це дещо контрінтуїтивно):

sudo dpkg-reconfigure dash

Це запитає, чи бажаєте ви dashбути системною оболонкою за замовчуванням; відповідь "Ні" ( Tabтоді Enter) і bashстане замість нього за замовчуванням ( тобто /bin/sh вказуватиме на /bin/bash).


1
Ваше рішення справді є найбільш розумним, але я прийняв іншу відповідь через детальні описи, що роз'яснюють питання. Вибачте за незручності.
Googlebot

@Googlebot не потрібно вибачатися, вибір прийнятої відповіді - це привілей запитувача. І я дістав із цього золотого значка ;-).
Стівен Кітт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.