web-dev-qa-db-ja.com

/ bin / dashとは何ですか?

/bin/shは私の選んだシェルへのシンボリックリンクだと思いました。私は常にbashを使用してきたので、/bin/sh/bin/bashを指すと想定しました。ただし、/bin/dashを指していることがわかります。

おかしくなります。 dashを起動してecho $Shellを実行すると、/bin/bashが出力されます(基本的には同じですか?)。ただし、dashのmanページはbashのmanページとは完全に異なります(つまり、notは同じですか?)。

28
aioobe

DebianとUbuntuは、いくつかの理由でダッシュ(iirc)に切り替えました。まず第一に、バッシュは長年にわたって大きくなっています。実際、Ubuntu 8.04システムの/bin/bashバイナリは/bin/dashのほぼ10倍(!)です。さて、それはシェルの日常的な使用ではそれほど重要ではありませんが、以下の状況では重要です。

  • ダッシュははるかに小さく、したがって読み込みが速くなります。これは、init-scriptの恩恵です。それらの多くを開始する必要がある場合は、毎回Bashの代わりにDashをロードすると、処理速度が大幅に向上します。
  • Dashのサイズが小さいため、DebianとUbuntuはinitrdのサイズのかなり大きなチャンクを削り落とし、他のもののためのより多くの余地を残します(また、高速化します)。

スクリプティングにBashの代わりにDashを使用することの欠点は、多くの人々がBashだけが持っている構文上の便利さ、いわゆる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 substitionエラーが表示されます。

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には、バシズムに関するニースのwikiページがあり、なぜそれらが一般的なシェルスクリプト、特にinitスクリプトが悪いのかについて説明しています。したがって、スクリプトのインタープリターとして/bin/sh/bin/bashのどちらが必要かを意識的に選択する必要があります。

ダッシュは、システムのデフォルトのシェルとして使用することは想定されていません。そのためにBashを使用してください。スクリプトの移植性のために、Dashをインタープリターとして使用して、スクリプトが他のLinuxフレーバーおよびUnixで実行される可能性を高めることができます。

44
wzzrd

ここを見てください: https://wiki.ubuntu.com/DashAsBinSh 多分それは役立ちます。

4
microspino

ダッシュは軽量のbashの代替品です。数年前に変更されたubuntuを使用していると想定しています。

でも、それはあまり良くありません、imho。 http://forums.debian.net/viewtopic.php?f=20&t=45116

1
Sirex

すべてのシェルが実行時に$Shellを設定するわけではないため、現在のシェルは次のようにしてわかります。

echo $0

エラーが発生した場合はcshです。それ以外の場合は、呼び出したargv[0]です。これは通常、シェルであり、先頭に-ハイフンが付いているため、ログインシェルであることを示しています。

argv[0]は呼び出しプロセスの制御下にあるため、これは保証ではありませんが、実際には最も信頼できるアプローチです。

0
Phil P