1. 概要

シェルとは何ですか? Linuxシステムでは、シェルは、関連するコマンドを実行して出力をユーザーに表示することにより、ユーザー入力を処理するためのインターフェイスです。 簡単に言うと、シェルはコマンドラインインターフェイスを介してタスクを実行するための環境です。 Linuxには、主にBourneシェルとCシェルの2種類のシェルがあります。 Bourneシェルには多くのサブカテゴリがあります

  • POSIXシェル( sh
  • ボーンシェル( sh
  • Kornシェル( ksh
  • ボーンアゲインシェル( bash
  • Zシェル( zsh
  • Debian Almquistシェル(ダッシュ

この記事では、BashとDashという2つの特定のシェルについて詳しく見ていきましょう。

2. ダッシュとバッシュの主な違い

Bashは、長い間、ほとんどのLinuxディストリビューションのデフォルトの標準インタラクティブシェルでした。 ただし、Ubuntu 6.10以降では、DashがBashに置き換わりました。 デフォルトのシェルを変更する主な理由は効率でした。

Bashはインタラクティブに使用できるフル機能のシェルであり、デフォルトのログインシェルです。 ただし、起動して使用するのははるかに大きく、時間がかかります。 一方、Dashシェルは、Bourneシェルの単純化された最新のPOSIX準拠バージョンです。 ダッシュにはいくつかの機能上の利点があります

  • 最小限のディスクスペースを消費しますが、機能が豊富です
  • 共有ライブラリへの依存度が低い
  • 比較的短い起動時間
  • 実行速度の向上

Bashシェルはより用途が広く、広範で、ユーザーとの対話型セッションに適していますが、前述のDashの機能は速度の点でBashを上回っています。 次のセクションでは、両方のシェルのパフォーマンスを比較してみましょう。

3. 起動時間ベンチマークテスト

単純なベンチマークテストは、一定の反復で一連のコマンドを実行し、プロセス全体の消費時間を計算することで構成されます。 対象となる両方のシェルは、相対的なパフォーマンスを測定するための時間消費を伴う同じテストを受けます。

起動時間ベンチマークは、「no-operation」(no-op、:)コマンドを使用した簡単なテストです。 各反復でシェルを開始し、no-opでは何もしません。 消費された合計時間は、追加の操作が実行されないため、各シェルの起動時間を示します。

まず、Bashの起動時間テストを見てみましょう。

$ cat bash_benchmark_script 
#!/bin/bash
for i in $(seq 1 1000);
do bash -c ":" ;
done
$ time bash bash_benchmark_script 
real	0m1.486s
user	0m1.152s
sys	0m0.327s

ここでは、 time ユーティリティを使用して、特定のスクリプトの実行にかかる時間を調べました。 bash_benchmark_script は、Bashシェルを呼び出して、1000の反復でno-opを実行しようとします。 これは、Bashシェルを1000回起動するだけで1.48秒かかることを意味します

次に、Dashの起動時間テストを確認しましょう。

$ cat dash_benchmark_script 
#!/bin/dash
for i in $(seq 1 1000);
do dash -c ":" ;
done
$ time dash dash_benchmark_script 
real	0m0.999s
user	0m0.819s
sys	0m0.134s

dash_benchmark_script は、Dashシェルを呼び出して、1000の反復でno-opを実行しようとします。 これは、Dashシェルを1000回起動するのにわずか0.9秒かかることを意味します

つまり、Dashシェルの起動時間はBashシェルの起動時間の約3分の1であることがわかります。 この効率は、Bash と比較して、共有ライブラリへの依存度が低く、Dashの合計サイズが小さいためです。

起動タイミングを比較したので、次のセクションでリアルタイムのコンピューティングパフォーマンスの比較について詳しく見ていきましょう。

4. シェルベンチテスト

シェルベンチ POSIXシェル比較のベンチマークユーティリティです。 The シェルベンチ ユーティリティは、任意のコマンドセットを無限ループで約1秒間実行します。 次に、1秒あたりの実行数を返します。これを使用して、スクリプトシェルの相対的なパフォーマンスが計算されます。 したがって、 1秒あたりの実行回数が多いほど、パフォーマンスが向上します

さらに、ユーティリティは8つを提供します サンプルベンチマークテスト さまざまな操作でパフォーマンスを確認します。 実際には、 sh bash ksh zsh dashなどのいくつかのシェルでテストを実行できます。同時にパフォーマンスを比較します。

それでは、 シェルベンチ BashとDashのパフォーマンスを比較するユーティリティ:

$ ./shellbench -s bash,dash sample/*
----------------------------------------------------
name                                 bash       dash
----------------------------------------------------
assign.sh: positional params      354,961  1,552,364 
assign.sh: variable               486,657  1,826,733 
assign.sh: local var              505,224  1,888,458 
cmp.sh: [ ]                       254,506    903,775 
cmp.sh: case                      487,977  1,984,710 
count.sh: posix                   394,556  1,219,866 
eval.sh: direct assign            265,855  1,219,592 
eval.sh: eval assign              127,999    780,953 
eval.sh: command subs               2,171      4,932 
func.sh: no func                  471,705  1,964,937 
func.sh: func                     273,133  1,563,748 
null.sh: assign variable          545,798  1,858,063 
null.sh: define function          591,780  2,189,993 
null.sh: undefined variable       440,758  1,943,129 
null.sh: : command                501,115  1,946,933 
output.sh: echo                   331,422  1,020,727 
output.sh: printf                 318,519    999,600 
subshell.sh: no subshell          488,495  1,966,461 
subshell.sh: brace                454,453  1,920,703 
subshell.sh: subshell               2,586      5,206 
subshell.sh: command subs           2,234      4,963 
subshell.sh: external command       1,037      1,083 
----------------------------------------------------
* count: number of executions per second 

-s スイッチを使用して、対象のシェル( bash、dash )を指定したことに注意してください。 shellbench の主な引数は、ベンチマークのために実行するスクリプトで構成されています。 ここでは、Shellbench自体に付属しているサンプルスクリプトを使用しました。

さらに、結果のグラフィック表現を見ることができます。

棒グラフは、変数の割り当て、論理比較、カウント操作、式の評価、関数呼び出し、表示操作、サブシェル操作などの複数の操作で、Bashと比較してDashのパフォーマンスが優れていることを示しています。 Dashシェルは、実行速度の点でBashシェルよりも約2〜5倍効率的です。

5. 結論

したがって、上記の実験から、 Dashシェルは、機能セットは小さいものの、起動時間と実行速度の両方の点でBashシェルよりもはるかに効率的であると結論付けられます。