В чем разница между оболочками Bash и Dash в Linux?

Ответ

Bash и Dash — это разные командные оболочки (shell) в Unix-подобных системах, созданные для различных целей.

Критерий Bash (Bourne Again SHell) Dash (Debian Almquist SHell)
Назначение Мощная интерактивная оболочка и язык сценариев. Быстрая, легковесная оболочка, ориентированная на выполнение системных скриптов.
Функциональность Богатый функционал: автодополнение, арифметические операции ((...)), расширенные конструкции [[ ... ]]. Строго соответствует стандарту POSIX, минимальный набор функций.
Скорость Медленнее при запуске из-за размера и сложности. Запускается и выполняется значительно быстрее.
Использование Часто используется как оболочка по умолчанию для пользователей (/bin/bash). Часто является символьной ссылкой для /bin/sh, используется для системных скриптов при загрузке.

Пример кода, который работает в Bash, но не в Dash:

# Этот цикл работает только в Bash (и других расширенных оболочках)
for ((i=0; i<3; i++)); do
    echo "Bash: $i"
done

# POSIX-совместимый аналог, который работает и в Bash, и в Dash
for i in 0 1 2; do
    echo "POSIX: $i"
done

Почему это важно: Для переносимых системных скриптов, где важна скорость запуска (например, init-скрипты), пишут на POSIX-совместимом синтаксисе, который выполнит Dash. Для интерактивной работы и сложных скриптов используют Bash.

Ответ 18+ 🔞

А, слушай, вот тебе наглядный пример, как две, казалось бы, одинаковые штуки на самом деле — хуй да маленько. Bash и Dash, блядь. Одна оболочка, другая оболочка, а разница — как между роскошным внедорожником с подогревом жопы и голым металлическим каркасом гоночного болида.

Bash — это наш жирный, раздобревший король. В нём есть всё, нахуй: автодополнение, чтоб не печатать, красивые скобочки [[ ... ]] для условий, арифметика прямо в ((...)). Сидишь, такой, в тепле и уюте, как барин. Но за это комфортное ебалово платишь скоростью — запускается он, как сонный медведь после зимней спячки.

А Dash — это ёбаный спецназовец, обритый налысо. Ничего лишнего, только голый стандарт POSIX. Зато выхватывается из ножен и рубит системные скрипты при загрузке с такой скоростью, что Bash только завистливо смотрит ему вслед. Поэтому-то /bin/sh у половины линуксов — это просто ссылочка на этого быстрого уёбка.

Смотри, вот тебе классический пиздец, где всё ломается:

# Эта красивая хуйня работает только в Bash. Dash на неё посмотрит и скажет: "Чё за нахуй?"
for ((i=0; i<3; i++)); do
    echo "Bash: $i"
done

# А вот это — святое, это на языке POSIX. Поймёт и Bash, и Dash, и даже какой-нибудь древний korn shell.
for i in 0 1 2; do
    echo "POSIX: $i"
done

Так что мораль, ёпта, простая, как три копейки: если пишешь скрипт, который должен впендюриться в систему на этапе загрузки и работать быстрее, чем мысль «а не налить ли мне чаю» — пиши на строгом POSIX, для Dash. А если кодишь себе что-то для удобства, где можно развернуться и поизвращаться — тогда давай, хуярь на Bash, используй все его плюшки. Главное — не перепутай, а то получится, как в той поговорке: везешь Dash'у конфетку, а он тебе — ебало кирпичом.