bashとshの違いは何ですか?


28

次の2種類のコードが使用されています。

#!/usr/bin/sh

そして:

#!/user/bin/bash

私はこれをオンラインで検索しましたが、意見はさまざまです。私がほとんどのウェブサイトで見た説明shbash、それはであり、本当の違いはないと言っています。

誰かがこれらの違いを知っていますか?どちらを使用するかを実用的な例を挙げていただけますか?


さまざまなシェルの一般的な概要について(shおよびだけでなくbash):http
akira

1
ここでもう一つの大きな歴史:faqs.org/faqs/unix-faq/shell/shell-differences
ジョン・ライト

回答:


34

bashshieのスーパーセットです。できることはすべてshあなたが行うことができますbash

Bashにはより多くの機能(分岐、組み込み、配列)があり、スクリプトを記述しやすくなっています。後の* nix's /bin/shへのリンクとして/bin/bash

これがチュートリアルであるものの完全な説明については


5
@Saif Bechan:Bourneシェル(sh)が拡張されなかった理由の1つは、Bash`が他の誰かによって書かれたということです。また、ライセンスの問題があったに違いない。Bourne Shellに関する記事を読むen.wikipedia.org/wiki/Bourne_shell
Felix

7
削除shすると、そこにあることを期待し、物事を解析する方法に依存する多くのスクリプトが破損します。Linuxユーザーは気にしないかもしれませんが、Solaris、AIX、またはHP-UXに数千ドルを費やす人々は非常にイライラするかもしれません。
njd

3
...さらにもっと楽しくするために、Ubuntuは/ bin / shをダッシュ​​にシンボリックリンクします。Dashはshやbashに完全に準拠しているわけではありませんが、起動が速くなるはずです。システムが起動すると、すべてのinit.dスクリプトが実行され、全体的に節約された時間は価値があると思います。
-kbyrd

8
Dashは完全にshに準拠していると確信しています。問題は、/ bin / shと言うスクリプトを書く人もいますが、スクリプト自体が動作するには/ bin / bashが必要なことです。ほとんどの場合、/ bin / shは単に/ bin / bashを指しているだけなので、誰も問題に気付きません。
-davr

8
@Saif:sh単純に拡張されなかったもう1つの理由があります。そのソースコードは純粋な地獄です。ご覧ください。それはCになっているはずです
...- grawity

6

従来、/ bin / shは元のBourneシェルでしたが、これには履歴やコマンドラインの編集やジョブ制御がありません。

過去15年ほどの間、ほとんどのUnixにはPOSIXシェルがインストールされているか、少なくともkshまたはbash(POSIXに非常に近い)がインストールされていますが、/ bin / shにはさらに制限されたシェルがあります

その理由は、古いshコマンドを期待する古いシェルスクリプトが引き続き機能するようにするためです。
文字が好きなので{}!のbashにとって特別な意味を持っている、それは(それらをエスケープせずに)それらの文字を使用して、古いシェルスクリプトが失敗する可能性があります。
(Bourneシェルは!!{1,2}文字どおりになりますが、bashはそれを前のコマンド(!!)の後にブレース拡張が続くものと解釈します)。

ただし、Linuxでは、shコマンドはほとんどの場合bash、すべての機能を備えたへの単なるリンクです。


2
Bashは、/ bin / shとして呼び出された場合、sh互換モードで動作するようになっています(常にではありません)。Ubuntuが/ bin / shを/ bin / bashへのリンクから/ bin / dashへのリンクに切り替えたときに、多くのものが壊れました。壊れたものは、標準的なshを使用すべきだったときに、バシズムを前提としています。
ブローム

4

shは、Bourneシェルまたは/ bin / shのいずれかを意味します。これは、ほとんどの最新のプラットフォーム上の他の(POSIX準拠の)シェルです。「POSIXシェル」は、POSIX定義された抽象シェルであり、POSIXモードのbash、またはデフォルトでkshまたはdashによって実装されます。/ bin / shは、ほとんどのプラットフォームでPOSIXに準拠するシェルであるため、POSIXシェルとも呼ばれることがあります。元のBourneシェルはPOSIXシェルではありません。

bashrefには、bashシェルとBourneシェルの違いのリストがあります。POSIXモードでbashが呼び出されたときman bash変更のリストがあります

/ bin / shはOS Xのシンボリックリンクまたはハードリンクではありませんが、/ bin / bashとほぼ同じサイズです。

$ ls -li /bin/{ba,}sh
29631757 -r-xr-xr-x  1 root  wheel  1333920 Jul 26 01:52 /bin/bash
29631758 -r-xr-xr-x  1 root  wheel  1334000 Jul 26 01:52 /bin/sh

マンバッシュ

shという名前でbashが呼び出されると、POSIX標準にも準拠しながら、shの歴史的なバージョンの起動時の動作を可能な限り模倣しようとします。

それ以外の点では、Bourneシェルの模倣はかなり制限されています。bash +B(Bourne)は、ブレース展開などの機能を実際に無効にします。

$ sh
$ echo {a,b}
a b
$ echo $BASH_VERSION
3.2.48(1)-release
$ bash +B
$ echo {a,b}
{a,b}

ただし、POSIXモードを無効にしても、エコーはecho -eデフォルトのように動作します。

$ sh
$ shopt -uo posix
$ echo '1\b2'
2

/ bin / shはUbuntuのダッシュであるため、一部のbashismはOS Xの/ bin / shで機能しますが、Ubuntuでは機能しません。

実際に元のBourneシェル(など)のスクリプトを作成する場合は、#!/usr/bin/env bash +B代わりに使用できます。

POSIX仕様やBourneシェルの一部ではない機能を回避したり、他のシェルですべてをテストしたりするよりも、bash用のスクリプトを書く方が簡単だと思います。


2

実際、/ bin / shは/ bin / bashへのリンクであっても、shとして起動すると動作が異なります。bashのマンページから:

shという名前でbashが呼び出されると、POSIX標準にも準拠しながら、shの歴史的なバージョンの起動時の動作を可能な限り模倣しようとします。

のようにsh、歴史的なshの動作をエミュレートしようとします。としてbash、それは対話型ログインシェルとして可能な限り有用であろうと試みます。


2

多くのシステム、特にSolarisでは、bashは動的にリンクされ、shは静的にリンクされます。これはセキュリティ上の脅威になる可能性があります。そのため、rootユーザーはシェルとして/ bin / shのみを使用する必要があります(rootとしてログインする必要がある場合)。


2
また、何か悪いことをしldconfigたり、/lib何らかの理由でディレクトリが消去されたりした場合に、緊急時に役立ちます。
ローレンス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.