/ bin / dashとは何ですか?


27

/bin/shが選んだシェルへのシンボリックリンクだと思いました。私はいつも使ってきたのでbash、それ/bin/shはを指すと思いました/bin/bash。しかし、それが指すことは判明してい/bin/dashます。

面白くなります。開始dashして実行するecho $SHELLと印刷されます/bin/bash(基本的に同じですか?)。ただし、のmanページはのmanページとdashはまったく異なりますbash(同じではありませんか?)。


1
@wzzrd、この質問はLinux固有ですか?
aioobe

1
ため息、私は15人の担当者が必要なので、これらのすてきな答えをすべて支持することはできません stackoverflowに18kがあるので、ハンディキャップを感じる:-/
aioobe

4
mmm dash .. / bin / crash(gdbファンの場合)、/ bin / slash(緊縮財政プログラム)、/ bin / mash(韓国では困難な時期)、/ bin / sash(チアリーダーの場合)、/ bin / thrashはどうですか(HDDでハード)、/ bin / flash(ただし、データを暗号化する場合のみ)、/ bin / stash(後で見つけるのは幸運です)、/ bin / cash(あなたはいつもインザマネーです)、/ bin / pash(PCのロマンシング)、/ bin / gash(aaargggh!)。
PP。

2
@PP-Metal音楽ファンには/ bin / thrashを読み、80年代のロックバンドリードギタリストのファンには/ bin / slashを読みました... :-P
gWaldo

1
echo $SHELL印刷さ/bin/bashれる理由は、その変数が、実行中の現在のシェルではなく、ログイン時に起動するデフォルトのシェルに設定されているためです。Bashプロンプトからkshまたはzshを起動してecho $SHELLも、まだと表示され/bin/bashます。ps現在実行中のものを見るために使用します。
追って通知があるまで一時停止します。

回答:


43

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

  • Dashははるかに小さいため、読み込みが速くなります。これは、initスクリプトの恩恵です。それらの多くを起動する必要がある場合、毎回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)を使用し、その中でBashismを使用する場合に重要になります。DebianとUbuntuには、Bashismについての素晴らしいwikiページがあり、なぜ一般的なシェルスクリプト、特にinitスクリプトが悪いのかについて説明しています。そのため、あなたは意識的にあなたが必要とするかどうかを選択すべき/bin/sh/bin/bashスクリプトのインタプリタとして。

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


1
Bashismsでスクリプトを作成する場合は、指定してください/bin/bash。Linux以外の多くのシステムには実際のshシェルがあり、実際のシェルはと互換性がありませんbash
クリスS

echo ${a#123}bashismではなく、POSIX Parameter拡張仕様の一部です。pubs.opengroup.org/onlinepubs/009695399/utilities/… 高度なsedスタイルのBashのものは得られません。posixのものはサブストリングスタイル+単純な拡張文字です。つまり、POSIXも可能にecho ${a#*6}
JMベッカー



0

$SHELL実行時にすべてのシェルが設定されるわけではないので、次のコマンドで現在のシェルを見つけます。

echo $0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.