Я думал, что это /bin/sh
была символическая ссылка на мой выбор оболочки. Я всегда использовал bash
, поэтому я предположил, что это /bin/sh
будет указывать /bin/bash
. Оказывается, однако, что это указывает на /bin/dash
.
Становится смешнее. Я начинаю dash
и делаю, echo $SHELL
и он печатает /bin/bash
(так они в основном то же самое?). Тем не менее, страница руководства dash
полностью отличается от страницы руководства bash
(так что они не совпадают?).
echo $SHELL
печати/bin/bash
заключается в том, что эта переменная установлена для оболочки по умолчанию, которая запускается при входе в систему, а не для текущей используемой оболочки. Запустите ksh или zsh из командной строки Bash иecho $SHELL
все равно скажете/bin/bash
. Используйте,ps
чтобы увидеть, что в данный момент работает.Ответы:
Debian и Ubuntu перешли на dash (iirc) из-за нескольких вещей. Прежде всего, Bash стал большим за эти годы. На самом деле
/bin/bash
двоичный файл в моей системе Ubuntu 8.04 почти в десять раз (!) Больше, чем/bin/dash
. Теперь, это не имеет большого значения для повседневного использования оболочки, но имеет значение в следующих ситуациях:Недостатком использования Dash вместо Bash для сценариев является то, что многие люди используют синтаксические тонкости, которыми обладает только Bash, так называемые Bashisms . Примерами Bashisms являются подстроки, как это:
И это:
Dash, с другой стороны, в основном стремится быть совместимым с POSIX (и не более того), даст вам ошибку Bad Substitution, если вы попробуете это:
Это будет иметь значение, если вы будете использовать
/bin/sh
(и, следовательноdash
) использовать в качестве переводчика для своих шелл-скриптов и использовать в них Bashisms. У Debian и Ubuntu есть хорошие вики-страницы о Bashisms и почему они плохи в сценариях оболочки в целом и сценариях инициализации в частности. Таким образом, вы должны сознательно выбирать , нужно ли вам/bin/sh
или в/bin/bash
качестве переводчика для вашего сценария.Dash не должен использоваться в качестве оболочки по умолчанию в ваших системах. Просто используйте Bash для этого. Для переносимости ваших сценариев вы можете использовать Dash в качестве интерпретатора, чтобы увеличить шансы запуска сценариев в других версиях Linux и Unix.
источник
/bin/bash
; многие не Linux-системы имеют настоящиеsh
оболочки, которые даже близко не совместимы сbash
.echo ${a#123}
это не bashism, это часть спецификации расширения POSIX Parameter. pubs.opengroup.org/onlinepubs/009695399/utilities/… Вы просто не получите более продвинутый Bash-стиль sed, Posix-стиль подстроки + простые символы расширения. То есть POSIX также позволяетecho ${a#*6}
Посмотрите здесь: https://wiki.ubuntu.com/DashAsBinSh, возможно, это поможет.
источник
dash - это легкая замена bash, я предполагаю, что вы используете Ubuntu, который изменился на него несколько лет назад.
Это не слишком хорошо, хотя, имхо. http://forums.debian.net/viewtopic.php?f=20&t=45116
источник
Поскольку
$SHELL
при запуске запускаются не все оболочки , вы узнаете текущую оболочку с помощью:Если он выдает ошибку, это csh, в противном случае это был тот
argv[0]
, с кем вы были вызваны, обычно это оболочка, возможно, с первым-
дефисом, чтобы указать, что это оболочка входа в систему.Это не гарантируется , поскольку
argv[0]
находится под контролем процесса вызова, но на практике это наиболее надежный подход.источник