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


27

Я думал, что это /bin/shбыла символическая ссылка на мой выбор оболочки. Я всегда использовал bash, поэтому я предположил, что это /bin/shбудет указывать /bin/bash. Оказывается, однако, что это указывает на /bin/dash.

Становится смешнее. Я начинаю dashи делаю, echo $SHELLи он печатает /bin/bash(так они в основном то же самое?). Тем не менее, страница руководства dashполностью отличается от страницы руководства bash(так что они не совпадают?).


1
@wzzrd, этот вопрос для linux?
Aioobe

1
вздох, я не могу высказать все эти хорошие ответы, так как мне нужно 15 повторений. Я чувствую себя неполноценным, поскольку у меня 18k на stackoverflow: - /
aioobe

4
ммм тире .. как насчет / bin / crash (для фанатов gdb), / bin / slash (программа жесткой экономии), / bin / mash (тяжелые времена в Корее), / bin / sash (для болельщиков), / bin / thrash (жестко на вашем жестком диске), / bin / flash (но только если вы шифруете свои данные), / bin / stash (удачи, найдя его позже), / bin / cash (вы всегда в деньгах), / bin / pash (роман на ПК), / bin / gash (aaargggh!).
пп.

2
@PP - Я бы прочитал / bin / thrash для поклонников металлической музыки и / bin / slash для фанатов ведущих гитаристов рок-группы 80-х ... :-P
gWaldo

1
Причина echo $SHELLпечати /bin/bashзаключается в том, что эта переменная установлена ​​для оболочки по умолчанию, которая запускается при входе в систему, а не для текущей используемой оболочки. Запустите ksh или zsh из командной строки Bash и echo $SHELLвсе равно скажете /bin/bash. Используйте, psчтобы увидеть, что в данный момент работает.
Приостановлено до дальнейшего уведомления.

Ответы:


43

Debian и Ubuntu перешли на dash (iirc) из-за нескольких вещей. Прежде всего, Bash стал большим за эти годы. На самом деле /bin/bashдвоичный файл в моей системе Ubuntu 8.04 почти в десять раз (!) Больше, чем /bin/dash. Теперь, это не имеет большого значения для повседневного использования оболочки, но имеет значение в следующих ситуациях:

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

Недостатком использования Dash вместо Bash для сценариев является то, что многие люди используют синтаксические тонкости, которыми обладает только Bash, так называемые Bashisms . Примерами Bashisms являются подстроки, как это:

echo $SHELL
/bin/bash
a=1234567890
echo ${a}
1234567890
echo ${a:3}
4567890
echo ${a:3:1}
4

И это:

echo ${a#123}
4567890

Dash, с другой стороны, в основном стремится быть совместимым с POSIX (и не более того), даст вам ошибку Bad Substitution, если вы попробуете это:

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) использовать в качестве переводчика для своих шелл-скриптов и использовать в них Bashisms. У Debian и Ubuntu есть хорошие вики-страницы о Bashisms и почему они плохи в сценариях оболочки в целом и сценариях инициализации в частности. Таким образом, вы должны сознательно выбирать , нужно ли вам /bin/shили в /bin/bashкачестве переводчика для вашего сценария.

Dash не должен использоваться в качестве оболочки по умолчанию в ваших системах. Просто используйте Bash для этого. Для переносимости ваших сценариев вы можете использовать Dash в качестве интерпретатора, чтобы увеличить шансы запуска сценариев в других версиях Linux и Unix.


1
Если вы пишете сценарии с Bashisms, пожалуйста, укажите /bin/bash; многие не Linux-системы имеют настоящие shоболочки, которые даже близко не совместимы с bash.
Крис С

echo ${a#123}это не bashism, это часть спецификации расширения POSIX Parameter. pubs.opengroup.org/onlinepubs/009695399/utilities/… Вы просто не получите более продвинутый Bash-стиль sed, Posix-стиль подстроки + простые символы расширения. То есть POSIX также позволяетecho ${a#*6}
JM Becker



0

Поскольку $SHELLпри запуске запускаются не все оболочки , вы узнаете текущую оболочку с помощью:

echo $0

Если он выдает ошибку, это csh, в противном случае это был тот argv[0], с кем вы были вызваны, обычно это оболочка, возможно, с первым -дефисом, чтобы указать, что это оболочка входа в систему.

Это не гарантируется , поскольку argv[0]находится под контролем процесса вызова, но на практике это наиболее надежный подход.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.