Linuxを使っていると、「bash」という言葉をよく耳にします。
しかし、Debian系のLinuxディストリビューション(UbuntuやDebianなど)では、実は裏側で「dash」という別のシェルが使われていることをご存知でしょうか。
dashは、bashより軽量で高速なシェルです。
対話的な操作ではなく、システムスクリプトの実行に特化しており、起動時間の短縮やリソース効率の向上に貢献しています。
この記事では、dashの基本概念、bashとの違い、パフォーマンス特性、そして実際の使い方を解説します。
dashとは
dash(Debian Almquist Shell)は、POSIX準拠の軽量なUnixシェルです。
もともとはash(Almquist Shell)から派生したもので、Debian系Linuxディストリビューションで広く使用されています。
基本情報
正式名称: Debian Almquist Shell
略称: dash
派生元: ash(Almquist Shell)
開発者: Herbert Xu(Debian移植版)
ライセンス: BSD
dashは、システムスクリプトの実行に最適化された軽量シェルです。
bashのような対話的機能は限定的ですが、その分高速で効率的に動作します。
dashの歴史
Almquist Shellの誕生
dashのルーツは、1980年代後半にKenneth Almquistが開発したAlmquist Shell(ash)にさかのぼります。
ashは、System V.4版のBourne Shellのクローンとして作成されました。
高速で小型、かつPOSIX互換を目指すシェルとして設計され、1989年5月30日にUSENETのcomp.sources.unixニュースグループで最初にリリースされました。
Debian版の開発
1997年初頭、Herbert XuがNetBSD版のashをベースにLinux版として移植しました。
当初は単に「ash」と呼ばれていましたが、2002年9月のバージョン0.4.1リリース時に「dash」(Debian Almquist Shell)に改名されました。
Ubuntu・Debianでの採用
2006年10月、Ubuntu 6.10で大きな転換が起こります。
それまでデフォルトの/bin/shはbashへのシンボリックリンクでしたが、この版からdashに変更されました。
主な理由は効率性の向上です。
特にシステム起動時に大量のシェルスクリプトが実行されるため、軽量で高速なdashに切り替えることで起動時間が大幅に短縮されました。
Debianも2011年2月リリースのDebian 6(コードネーム: Squeeze)から、デフォルトの/bin/shとしてdashを採用しました。
dashの主な特徴
POSIX準拠
dashはPOSIX(Portable Operating System Interface)標準に厳密に準拠するように設計されています。
POSIX準拠のシェルスクリプトであれば、様々なUnix系システムで互換性を保ったまま動作させることができます。
軽量性
dashは非常に軽量です。
サイズを比較すると以下のようになります。
インストールサイズ:
- dash: 約134KB
- bash: 約6.5MB
ソースコード行数:
- dash: 約13,000行
- bash: 約176,000行
bashの約50分の1のサイズで、必要最低限の機能に絞り込まれています。
高速性
軽量である分、dashはbashよりも高速に動作します。
特に起動時間とスクリプト実行速度で顕著な差が出ます。
ベンチマークテストでは、dashはbashの2〜4倍程度高速に動作することが確認されています。
依存ライブラリの少なさ
dashは依存する共有ライブラリが少ないため、ソフトウェアやハードウェアの障害に対してより堅牢です。
システムの一部が破損した場合でも、dashが動作する可能性が高いため、システム復旧作業に適しています。
bashとdashの違い
用途の違い
bash(Bourne Again Shell):
- 対話的シェルとしての使用に最適化
- 豊富な機能とユーザー補助機能
- コマンド履歴、タブ補完、プロンプトのカスタマイズなど
dash(Debian Almquist Shell):
- スクリプト実行に特化
- 最小限の機能でPOSIX準拠を重視
- 対話的機能は限定的
機能面での違い
dashには、bashで使える以下のような機能がありません。
bashにあってdashにない機能(bashism):
- 配列のサポート
[[ ]]による拡張テスト構文functionキーワードによる関数定義- プロセス置換
<(command) - 文字列操作の高度な機能
{1..10}のようなブレース展開$(( ))内での変数名の$省略echo -eオプション(一部の環境)
デフォルトシェルの違い
Debian/Ubuntu系では次のような使い分けがされています。
対話的ログインシェル: bash
- ターミナルを開いたときに起動するシェル
- ユーザーがコマンドを入力して使うシェル
システムシェル(/bin/sh): dash
- スクリプトで
#!/bin/shと書かれた場合に実行されるシェル - システムの起動スクリプトなどで使用
# ログインシェルの確認
$ echo $SHELL
/bin/bash
# /bin/shの実体を確認
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 30 2012 /bin/sh -> dash
パフォーマンス比較
実際のベンチマークテストで、dashとbashのパフォーマンスを比較してみましょう。
起動時間の比較
1000回シェルを起動して何も実行しない(no-op)テストです。
bashの場合:
#!/bin/bash
for i in $(seq 1 1000); do
bash -c ":"
done
実行時間: 約3.0秒
dashの場合:
#!/bin/dash
for i in $(seq 1 1000); do
dash -c ":"
done
実行時間: 約1.1秒
dashはbashの約3分の1の時間で起動します。
これは、依存ライブラリが少なく、シェル自体のサイズが小さいためです。
スクリプト実行速度の比較
ShellBenchなどのベンチマークツールを使った測定では、以下のような結果が報告されています。
実行速度:
- 単純な処理: dashはbashの2〜5倍高速
- 複雑な処理: bashとの差は縮まるが、依然としてdashが高速
メモリ使用量:
- dashはbashの約10分の1のメモリで動作
システム起動時には数百のスクリプトが実行されるため、この速度差が全体の起動時間に大きく影響します。
使い分けの指針
dashが適している場合
システムスクリプト
- 起動スクリプト
- cron jobs
- 自動化タスク
POSIX互換性が重要な場合
- 複数のUnix系システムで動作させるスクリプト
- 移植性を重視するスクリプト
パフォーマンスが重要な場合
- 頻繁に実行されるスクリプト
- リソースが限られた環境(組み込みLinuxなど)
bashが適している場合
対話的な操作
- 日常的なコマンドライン作業
- ターミナルでの対話的操作
bash固有の機能が必要な場合
- 配列を使う必要がある
- 高度な文字列処理が必要
- プロセス置換を使いたい
開発やデバッグ
- スクリプトの開発段階
- インタラクティブなデバッグ作業
bashismの問題
dashへの移行時に大きな問題となったのが「bashism」です。
bashismとは
bashismとは、bash固有の機能を使ったシェルスクリプトの記述のことです。
多くのスクリプトが、シバン行に#!/bin/shと書きながら、実際にはbash固有の機能を使っていました。
これは、多くのLinuxディストリビューションで/bin/shがbashへのシンボリックリンクだったため、問題が表面化していなかったのです。
よくあるbashismの例
配列の使用:
#!/bin/sh
# これはbashismでdashでは動かない
array=(one two three)
echo ${array[0]}
拡張テスト構文:
#!/bin/sh
# これはbashismでdashでは動かない
if [[ $var == "test" ]]; then
echo "matched"
fi
function キーワード:
#!/bin/sh
# これはbashismでdashでは動かない
function my_func() {
echo "Hello"
}
bashismの検出方法
checkbashismsツールを使うことで、スクリプト内のbashismを検出できます。
# インストール(Debian/Ubuntu)
sudo apt install devscripts
# スクリプトのチェック
checkbashisms script.sh
bashismへの対処方法
方法1: シバン行を修正する
bash固有の機能が必要な場合は、明示的にbashを指定します。
#!/bin/bash
# bashが必要であることを明示
方法2: POSIX準拠に書き換える
POSIX準拠の文法に書き換えます。
#!/bin/sh
# POSIX準拠の書き方
if [ "$var" = "test" ]; then
echo "matched"
fi
dashの実際の使用例
シバン行での指定
dashを明示的に使用する場合は、シバン行に以下のように記述します。
#!/bin/dash
echo "This script runs with dash"
POSIX準拠スクリプトの例
#!/bin/sh
# POSIX準拠のバックアップスクリプト
# 変数の定義
backup_dir="/backup"
source_dir="/data"
date_str=$(date +%Y%m%d)
# ディレクトリの作成
if [ ! -d "$backup_dir" ]; then
mkdir -p "$backup_dir"
fi
# バックアップの実行
tar -czf "$backup_dir/backup_$date_str.tar.gz" "$source_dir"
# 結果の確認
if [ $? -eq 0 ]; then
echo "Backup completed successfully"
else
echo "Backup failed"
exit 1
fi
このスクリプトは、POSIX準拠のため、dashでもbashでも動作します。
デフォルトシェルの変更
Ubuntu/Debianで/bin/shのリンク先を変更する場合は、以下のコマンドを使います。
# dashからbashに戻す場合
sudo dpkg-reconfigure dash
# 「No」を選択
# 確認
ls -l /bin/sh
ただし、システムスクリプトの中にはdash固有の動作に依存しているものもあるため、変更には注意が必要です。
まとめ
dashは、POSIX準拠の軽量で高速なシェルです。
Debian系Linuxディストリビューションでは、システムスクリプトの実行に使用されており、起動時間の短縮とリソース効率の向上に貢献しています。
dashの主な特徴:
- bashの約50分の1の軽量性
- bashの2〜4倍の実行速度
- POSIX準拠で移植性が高い
- システムスクリプトに最適
使い分けの基本:
- 対話的操作: bash
- システムスクリプト: dash
- POSIX互換性が必要: dash
- bash固有機能が必要: bash
Linuxを使う上で、bashとdashの違いを理解しておくことは、効率的なスクリプト作成とシステム管理に役立ちます。
参考情報
この記事は以下の情報源を参考に作成しました。
- Wikipedia「Debian Almquist shell」(日本語版・英語版)
- Wikipedia「Almquist Shell」(日本語版・英語版)
- Arch Linux Wiki「Dash」(日本語版・英語版)
- Ubuntu Wiki「DashAsBinSh」
- Baeldung「Linux Shells Performance: dash vs bash」
- Debian Package Information「dash」
シェルの使い方については、シェルスクリプトの書き方やbashとzshの違い、Linuxターミナルで使用中のシェルを確認する方法の記事も参考にしてください。

コメント