Я вижу два типа используемого кода:
#!/usr/bin/sh
а также:
#!/user/bin/bash
Я искал это онлайн, и мнения сильно различаются. Объяснения, которые я видел на большинстве веб-сайтов, говорят, что sh
он старше bash
, и что нет никакой разницы.
Кто-нибудь знает разницу между этими? Можете ли вы дать мне практический пример, когда использовать один над другим?
sh
иbash
): http://en.wikipedia.org/wiki/Comparison_of_command_shellsОтветы:
bash
является надмножествомsh
т.е. все, что вы можете сделать,sh
вы можете сделать вbash
.Bash имеет больше возможностей (ветвление, встроенные функции, массивы), что облегчает написание скрипта. Некоторые более поздние * nix'ы имеют
/bin/sh
ссылку на/bin/bash
Для полного объяснения того, что вот учебник
источник
sh
) была не просто расширена, является то, что Bash` был написан кем-то другим. Также я уверен, что были проблемы с лицензией. Прочитайте статью о Bourne Shell. En.wikipedia.org/wiki/Bourne_shellsh
приведет к поломке множества скриптов, которые ожидают его появления и полагаются на то, как он разбирает вещи. Пользователям Linux может быть все равно, но люди, которые тратят тысячи долларов на Solaris, AIX или HP-UX, могут быть очень раздражены.sh
его не просто расширили: его исходный код - настоящий ад. Посмотри. Это должно быть C ...Традиционно, / bin / sh был бы оригинальной оболочкой Bourne, которая не имеет истории или редактирования в командной строке, а также не контролирует работу.
В течение последних 15 лет в большинстве Unix-систем была установлена оболочка POSIX, или, по крайней мере, ksh или bash (которые очень похожи на POSIX-подобные), но все еще имеют более ограниченную оболочку в / bin / sh
Причина в том, что старые сценарии оболочки, которые ожидают, что старая
sh
команда все еще будут работать.Так как персонажи любят
{
,}
и!
имеют особое значение для Баша, вполне возможно , что старший сценарий оболочки , используя эти символы (без побега их) может потерпеть неудачу.(Оболочка Bourne будет восприниматься
!!{1,2}
буквально, тогда как bash интерпретирует это как повтор предыдущей команды (!!
) с последующим расширением скобки).В Linux
sh
команда почти всегда является ссылкой наbash
все те же функции.источник
sh может означать либо оболочку Bourne, либо / bin / sh, которая является какой-либо другой (POSIX-совместимой) оболочкой на большинстве современных платформ. «Оболочка POSIX» - это абстрактная оболочка, определенная POSIX , которая реализуется с помощью bash в режиме POSIX, или ksh или dash по умолчанию. / bin / sh иногда также называют оболочкой POSIX, потому что это оболочка, которая соответствует POSIX на большинстве платформ. Оригинальные оболочки Bourne не являются оболочками POSIX.
У bashref есть список различий между оболочками bash и Bourne .
man bash
имеет список изменений, когда bash вызывается в режиме POSIX ./ bin / sh не является символической ссылкой или жесткой ссылкой в OS X, но он почти такого же размера, как / bin / bash:
человек Баш :
В остальном мимикрирование снарядов Борна довольно ограничено.
bash +B
(Борн) фактически отключил бы такие функции, как расширение фигурных скобок.Но даже если вы отключите режим POSIX, эхо ведет себя как
echo -e
по умолчанию:/ bin / sh - черта в Ubuntu , поэтому некоторые ошибки работают с / bin / sh в OS X, но не в Ubuntu.
Если вы действительно хотите писать сценарии для (что-то вроде) оригинальных оболочек Борна, вы можете использовать
#!/usr/bin/env bash +B
вместо этого.Я думаю, что проще написать сценарии для bash, чем избегать функций, которые не являются частью спецификаций POSIX или оболочек Bourne, или проверять все с помощью других оболочек.
источник
На самом деле, даже если / bin / sh может быть ссылкой на / bin / bash, при запуске как sh он ведет себя по-другому. Из справочной страницы bash:
Так как
sh
он пытается подражать историческому поведению. Какbash
, он пытается быть максимально полезным, как интерактивная оболочка входа в систему.источник
Во многих системах, в частности в Solaris, bash динамически связан, а sh статически связан. Это может представлять угрозу безопасности, поэтому пользователь root должен использовать только / bin / sh в качестве оболочки (если вам когда-либо понадобится войти в систему как root).
источник
ldconfig
или ваш/lib
каталог по какой-то причине уничтожен.