я думал /bin/sh
была символической ссылкой на мою любимую оболочку. Я всегда использовал bash
, поэтому я предположил, что /bin/sh
указал бы на /bin/bash
. Однако оказывается, что это указывает на /bin/dash
.
Становится смешнее. я начинаю dash
и делай echo $SHELL
и он печатает /bin/bash
(так они в основном такие же?). Однако страница руководства dash
полностью отличается от справочной страницы bash
(так что они не тот же самый?).
Debian и Ubuntu перешли на dash (iirc) по нескольким причинам. Во-первых, за годы Bash стал популярным. Фактически, /bin/bash
двоичный файл в моей системе Ubuntu 8.04 почти в десять раз (!) больше, чем /bin/dash
. Это не имеет большого значения для повседневного использования оболочки, но имеет значение в следующих ситуациях:
Обратной стороной использования Dash вместо Bash для написания сценариев является то, что многие люди используют синтаксические тонкости, которые есть только в Bash, так называемые Башизмы. Примеры башизмов - это подстроки, например:
echo $SHELL
/bin/bash
a=1234567890
echo ${a}
1234567890
echo ${a:3}
4567890
echo ${a:3:1}
4
И это:
echo ${a#123}
4567890
Dash, с другой стороны, в основном нацелен на соответствие POSIX (и не более того), даст вам Плохая подстановка ошибка, если вы попробуете это:
echo $SHELL
/bin/dash
# actually, it will read /bin/bash above, because if you just run dash
# it will not set the $SHELL variable :)
a=1234567890
echo ${a}
1234567890
echo ${a:3}
dash: Bad substitution
Это будет иметь значение, если вы используете /bin/sh
(и поэтому dash
) в качестве интерпретатора ваших сценариев оболочки и используйте в них башизмы. В Debian и Ubuntu есть хорошие вики-страницы о Bashisms и о том, почему они плохи в сценариях оболочки в целом и сценариях инициализации в частности. Поэтому следует осознанно выбирать, нужны ли вам /bin/sh
или /bin/bash
как интерпретатор вашего скрипта.
Dash не предполагается использовать в качестве оболочки по умолчанию в ваших системах. Просто используйте для этого Bash. Для переносимости ваших скриптов вы можете использовать Dash в качестве интерпретатора, чтобы повысить вероятность того, что скрипты будут работать в других версиях Linux и Unix.
Взгляните сюда: https://wiki.ubuntu.com/DashAsBinSh может это поможет.
dash - это легкая замена bash, предполагая, что вы используете ubuntu, которая была заменена на нее несколько лет назад.
Хотя это не слишком хорошо, имхо. http://forums.debian.net/viewtopic.php?f=20&t=45116
Поскольку не все снаряды установлены $SHELL
при запуске вы узнаете свою текущую оболочку с помощью:
echo $0
Если выдает ошибку, это csh, иначе это argv[0]
вы были вызваны, обычно это оболочка, возможно, с ведущей -
дефис, чтобы указать, что это оболочка входа.
Это не гарантированный, поскольку argv[0]
находится под контролем процесса вызова, но на практике это наиболее надежный подход.