Я устанавливаю огромную программу, которая имеет свои ресурсы в виде rpm
файла. Это застряло на линии
#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]
Видимо, в Red Hat Linux sh
работают bash
с этим синтаксисом, но он выдает ошибку unexpected operator
в Ubuntu.
Я не могу изменить скрипт, так bash
как скрипт поставляется из rpm
пакета. Я могу извлечь и упаковать rpm
пакет, но таких сценариев может быть много.
Есть ли способ изменить оболочку по умолчанию, чтобы она воспринималась #!/bin/sh
как bash
или что-то еще, что может обработать [
оператор?
==
что должно быть=
. Это и то, что расширения переменных должны быть в двойных кавычках.[
это не оператор, а встроенная команда, которая вызываетсяtest
. Неожиданный оператор есть,==
и его следует заменить,=
потому что он не совместим с POSIX.$SCITEGICPERLHOME
следует цитировать.#!/bin/sh
, они должны убедиться, что они используют только функции оболочки POSIX, а неbash
расширения. Этот программист очень небрежный. Он должен либо исправить свой код, либо использовать#!/bin/bash
.Ответы:
Есть несколько программ, которые реализуют язык
/bin/sh
. В Ubuntu/bin/sh
это dash, который предназначен для быстрого использования небольшого объема памяти и не поддерживает намного больше, чем ожидаемый минимум/bin/sh
. На RHEL/bin/sh
это bash, который работает медленнее и использует больше памяти, но имеет больше возможностей. Одной из таких функций является==
оператор[
условного синтаксиса. Dash поддерживает[
, что является основной функцией sh, но у него нет==
оператора, который является расширением bash (и ksh и zsh).Вы можете переключить свою систему на использование bash. На Ubuntu
/bin/sh
есть символическая ссылка наdash
.bash
Вместо этого вы можете сделать это символической ссылкой . Текущие версии Debian и Ubuntu (и производных) делают эту опцию установки dash. Чтобы изменить это, запуститеи ответьте «да», чтобы сохранить тире как
/bin/sh
или «нет», чтобы переключиться на bash.Вы можете сохранить bash как
/bin/sh
, но это сделает вашу систему немного медленнее. Можно даже предположить, что какой-то системный скрипт несовместим с bash, хотя это маловероятно, поскольку bash в основном является надмножеством dash.Для дистрибутивов, у которых нет интерфейса для выбора между реализациями
/bin/sh
, вот как переключиться на bash.Держите терминал открытым и убедитесь, что после этого вы можете запустить некоторые
sh
скрипты. Если вы запутаете эту команду, она сделает вашу систему непригодной для использования. (Кстати, причина, по которой я использовал несколько приведенных выше команд, а не прямолинейный взгляд,sudo ln -sf bash /bin/sh
заключается в том, чтоln -sf
он не является атомарным. В маловероятно маловероятном случае сбоя компьютера во время этой операции вам потребуется загрузка с загрузочного носителя для его восстановления. В отличие отmv
атомного.)Чтобы восстановить черту как
/bin/sh
:Обратите внимание, что если
/bin/bash
в вашем дистрибутиве по умолчанию используется sh , переключение на dash может привести к сбою сценариев, поскольку bash имеет гораздо больше возможностей, чем dash. Сценарии Bash должны начинаться с#!/bin/bash
, и сценарии, начинающиеся с,#!/bin/sh
не должны использовать специфичные для bash функции, но дистрибутивы, поставляемые с bash,/bin/sh
могут использовать специфичные для bash функции в#!/bin/sh
сценариях, специфичных для этого дистрибутива (это нормально, если пользователи не ожидают может переключиться на dash как/bin/sh
и нет никаких ожиданий, что эти сценарии будут работать в другом дистрибутиве).источник
/bin/sh
используется Bash, это ошибка либо в системе (в пакете со сценарием), либо вsh
-mode Bash . Как говорит Стивен, система явно позволяет/bin/sh
вернуться к Bash черезdpkg-reconfigure
. Это также упоминается как возможность в вики Ubuntu по этому вопросу: wiki.ubuntu.com/DashAsBinSh/bin/sh
это bash, это ошибка. Однако ошибки случаются. Я рекомендую придерживаться значения по умолчанию, если вы не способны и готовы диагностировать такие ошибки, потому что другие люди проверили это для вас. Я использовал dash, как и/bin/sh
раньше, когда он официально поддерживался в Debian, но я рисковал, зная, что смогу справиться, если что-то случится.debconf
при следующемdash
обновлении; по общему признанию это не случится часто (если вообще, в данном выпуске) для систем, работающих под управлением стабильной Debian.Для того, чтобы перейти
sh
кbash
(вместоdash
, по умолчанию), перенастроитьdash
(да, это несколько нелогичным):Это спросит, хотите ли вы
dash
быть системной оболочкой по умолчанию; ответьте «Нет» ( Tabтогда Enter) иbash
вместо этого станете по умолчанию ( т.е./bin/sh
укажете на/bin/bash
).источник