/bin/sh
は私の選んだシェルへのシンボリックリンクだと思いました。私は常にbash
を使用してきたので、/bin/sh
は/bin/bash
を指すと想定しました。ただし、/bin/dash
を指していることがわかります。
おかしくなります。 dash
を起動してecho $Shell
を実行すると、/bin/bash
が出力されます(基本的には同じですか?)。ただし、dash
のmanページはbash
のmanページとは完全に異なります(つまり、notは同じですか?)。
DebianとUbuntuは、いくつかの理由でダッシュ(iirc)に切り替えました。まず第一に、バッシュは長年にわたって大きくなっています。実際、Ubuntu 8.04システムの/bin/bash
バイナリは/bin/dash
のほぼ10倍(!)です。さて、それはシェルの日常的な使用ではそれほど重要ではありませんが、以下の状況では重要です。
スクリプティングに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で実行される可能性を高めることができます。
ここを見てください: https://wiki.ubuntu.com/DashAsBinSh 多分それは役立ちます。
ダッシュは軽量のbashの代替品です。数年前に変更されたubuntuを使用していると想定しています。
でも、それはあまり良くありません、imho。 http://forums.debian.net/viewtopic.php?f=20&t=45116
すべてのシェルが実行時に$Shell
を設定するわけではないため、現在のシェルは次のようにしてわかります。
echo $0
エラーが発生した場合はcshです。それ以外の場合は、呼び出したargv[0]
です。これは通常、シェルであり、先頭に-
ハイフンが付いているため、ログインシェルであることを示しています。
argv[0]
は呼び出しプロセスの制御下にあるため、これは保証ではありませんが、実際には最も信頼できるアプローチです。