Назад | Перейти на главную страницу

Что такое / bin / dash?

я думал /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 намного меньше и поэтому загружается быстрее, что является благом для скриптов инициализации. Если вам нужно запускать много из них, загрузка Dash вместо Bash каждый раз значительно ускоряет работу.
  • Из-за меньшего размера Dash, Debian и Ubuntu могут сократить довольно большой кусок размера их initrd, оставляя больше места для других вещей (и, опять же, ускоряя процесс).

Обратной стороной использования 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] находится под контролем процесса вызова, но на практике это наиболее надежный подход.