Ubuntuの標準シェル「Dash」とは?使い方とBashとの違いを徹底解説
Ubuntuを使っていると、Dash(dash)という言葉を耳にすることがあるかもしれません。特に、シェルスクリプトを書く際には、このDashの存在が重要になってきます。多くのユーザーが日常的に使うシェルはBashですが、実はUbuntuのシステムの裏側ではDashが活躍しています。この記事では、Ubuntuの標準シェルであるDashの位置付けから、基本的な使い方、そして多くの人が混乱しがちなBashとの違いまで、初心者にも分かりやすく解説します。
Webクリエーターの皆さんが、サーバー設定やデプロイ作業でシェルスクリプトに触れる機会は増えています。この記事のコードはすべてコピー&ペーストするだけで動作するように作られているので、ぜひ実際に手を動かして「動く」楽しさを体験してください!
そもそもDashとは?なぜUbuntuで使われているの?
Dash (Debian Almquist shell) は、UNIX系のOSで使われるコマンドラインシェルの一つです。最大の特徴は、軽量で高速に動作すること。多くの機能を備えた高機能なシェルであるBashと比較して、Dashは基本的な機能に絞られている分、スクリプトの実行速度が非常に速いのです。
Ubuntu(およびそのベースであるDebian)では、この高速性を活かして、システムの起動スクリプトや様々なバックグラウンド処理を実行するためのデフォルトのシステムシェル(/bin/sh)としてDashを採用しています。つまり、私たちが普段ターミナルで対話的に使うログインシェル(/bin/bash)とは別に、システム内部ではDashが効率的にタスクをこなしている、というわけです。この「システムシェルはDash、ログインシェルはBash」という分業体制が、Ubuntuの軽快な動作を支えているのです。
自分の環境で/bin/shが何にリンクされているかを確認してみましょう。以下のコマンドを実行すると、その実体が表示されます。
ls -l /bin/sh
多くの場合、/bin/sh -> dash と表示され、/bin/shの実体がDashであることが分かります。
Dashの基本的な使い方
それでは、実際にDashを使って簡単なスクリプトを実行してみましょう。Dashの使い方は非常にシンプルです。
1. スクリプトファイルの作成
まず、テキストエディタで簡単なスクリプトファイルを作成します。ここではhello_dash.shという名前にします。
nano hello_dash.sh
エディタが開いたら、以下の内容を貼り付けて保存します。
#!/bin/sh
# 上の行は「シバン(shebang)」といい、このスクリプトを/bin/sh (つまりDash)で実行するよう指定します。
echo "Hello, Dash!"
2. 実行権限の付与
作成したスクリプトファイルに、実行するための権限を与えます。
chmod +x hello_dash.sh
3. スクリプトの実行
準備ができたので、スクリプトを実行してみましょう。
./hello_dash.sh
ターミナルに「Hello, Dash!」と表示されれば成功です!これがDashスクリプトの最も基本的な実行方法です。シバンで#!/bin/shを指定したことで、このスクリプトはDashによって解釈・実行されました。
応用例:Dashで変数とループを使ってみる
もう少し実践的な例として、変数とwhileループを使ったスクリプトを見てみましょう。基本的な文法はBashと似ていますが、Dashで確実に動作するPOSIX準拠の書き方を意識することが大切です。
以下のスクリプトは、カウンターが3になるまでループし、現在のカウント数を表示します。
#!/bin/sh
# 変数を定義
COUNT=1
# COUNTが3以下の間、ループを続ける
while [ "$COUNT" -le 3 ]; do
echo "現在のカウント: $COUNT"
# COUNTに1を加算する。exprコマンドを使うのが確実な方法
COUNT=$(expr "$COUNT" + 1)
done
echo "ループが終了しました。"
このスクリプトをloop_test.shなどの名前で保存し、同様に実行権限を与えて./loop_test.shで実行してみてください。1から3までカウントが表示されるはずです。
[ "$COUNT" -le 3 ]: 条件分岐です。-leは「less than or equal to(以下)」を意味します。Bashでよく使われる[[ ... ]]はDashでは使えないため、[ ... ]を使いましょう。COUNT=$(expr "$COUNT" + 1): 変数の計算です。Bashでは((COUNT++))のような簡単な書き方ができますが、Dashではexprコマンドを使うのが最も確実で互換性の高い方法です。
気をつけるべき点:DashとBashの非互換性
シェルスクリプトを書く上で最も初心者がハマりやすいのが、DashとBashの機能差です。普段使っているターミナル(Bash)では問題なく動くコマンドが、/bin/shを指定したスクリプト(Dash)ではエラーになる、というケースが頻発します。
Web制作の現場でも、サーバー上でcronジョブとしてスクリプトを動かしたり、デプロイツールからスクリプトを実行したりする場合、システムのデフォルトであるDashで実行されることがよくあります。そのため、Bashでしか使えない機能(Bashismと呼ばれます)を無意識に使ってしまうと、本番環境でだけエラーが起きる原因になります。
以下に、特に注意すべき代表的な非互換性の例を挙げます。
1. 配列が使えない
Bashではfruits=("Apple" "Banana" "Cherry")のように配列を簡単に扱えますが、Dashは配列をサポートしていません。
Bashでだけ動く例(Dashではエラー):
#!/bin/bash
# シバンが/bin/bashであることに注意
fruits=("Apple" "Banana" "Cherry")
echo "最初のフルーツは ${fruits[0]} です。"
2. Brace Expansion (ブレース展開) {..} が使えない
Bashではecho file{1..3}.txtと書くとfile1.txt file2.txt file3.txtと展開してくれますが、Dashにはこの機能がありません。
Bashでだけ動く例(Dashではそのまま表示される):
#!/bin/bash
# このコマンドはBashでは3つのファイル名を生成する
touch data_{a,b,c}.csv
Dashで同じことをするには、forループなどを使う必要があります。
3. テストコマンド `[[ ... ]]` が使えない
前述の通り、Bashの拡張テストコマンドである[[ ... ]]は、より高機能ですがDashでは使えません。POSIX準拠の[ ... ]を使いましょう。
Bashでだけ動く例(Dashではエラー):
#!/bin/bash
NAME="hoge"
# [[ ... ]] は && や || を内部で使える
if [[ "$NAME" == "hoge" && -n "$NAME" ]]; then
echo "名前はhogeです。"
fi
Dashでも動く代替コード:
#!/bin/sh
NAME="hoge"
# [ ... ] では -a (AND) を使う
if [ "$NAME" = "hoge" -a -n "$NAME" ]; then
echo "名前はhogeです。"
fi
文字列比較が==ではなく=になっている点にも注意してください。
まとめ:Dashを意識して堅牢なスクリプトを書こう
今回は、Ubuntuの標準シェルであるDashについて、その役割と基本的な使い方、そしてBashとの違いを解説しました。
- Dashは軽量・高速なため、Ubuntuのシステムシェル(
/bin/sh)として使われている。 - 普段私たちが使うログインシェルはBashであり、機能差がある。
- シェルスクリプトを書くときは、
#!/bin/shと記述し、Dashでも動作するPOSIX準拠の書き方を心がけると、環境に依存しない堅牢なスクリプトになる。 - 配列、ブレース展開、
[[ ... ]]などはBash独自の機能(Bashism)なので、/bin/shスクリプトでは使わないように注意する。
最初は戸惑うかもしれませんが、この違いを理解しておけば「ローカルでは動いたのにサーバーでは動かない」といったトラブルを未然に防ぐことができます。Ubuntu dashの世界に慣れ、より信頼性の高いシェルスクリプト作成を目指しましょう!
関連記事
さらに詳しいスクリプトの書き方や、Bashとの互換性について知りたい方は、こちらの記事もおすすめです。