次の2種類のコードが使用されています。
#!/usr/bin/sh
そして:
#!/user/bin/bash
私はこれをオンラインで検索しましたが、意見はさまざまです。私がほとんどのウェブサイトで見た説明sh
はbash
、それはであり、本当の違いはないと言っています。
誰かがこれらの違いを知っていますか?どちらを使用するかを実用的な例を挙げていただけますか?
次の2種類のコードが使用されています。
#!/usr/bin/sh
そして:
#!/user/bin/bash
私はこれをオンラインで検索しましたが、意見はさまざまです。私がほとんどのウェブサイトで見た説明sh
はbash
、それはであり、本当の違いはないと言っています。
誰かがこれらの違いを知っていますか?どちらを使用するかを実用的な例を挙げていただけますか?
回答:
bash
sh
ieのスーパーセットです。できることはすべてsh
あなたが行うことができますbash
。
Bashにはより多くの機能(分岐、組み込み、配列)があり、スクリプトを記述しやすくなっています。後の* nix's /bin/sh
へのリンクとして/bin/bash
これがチュートリアルであるものの完全な説明については
sh
)が拡張されなかった理由の1つは、Bash`が他の誰かによって書かれたということです。また、ライセンスの問題があったに違いない。Bourne Shellに関する記事を読むen.wikipedia.org/wiki/Bourne_shell
sh
すると、そこにあることを期待し、物事を解析する方法に依存する多くのスクリプトが破損します。Linuxユーザーは気にしないかもしれませんが、Solaris、AIX、またはHP-UXに数千ドルを費やす人々は非常にイライラするかもしれません。
sh
単純に拡張されなかったもう1つの理由があります。そのソースコードは純粋な地獄です。ご覧ください。それはCになっているはずです
従来、/ bin / shは元のBourneシェルでしたが、これには履歴やコマンドラインの編集やジョブ制御がありません。
過去15年ほどの間、ほとんどのUnixにはPOSIXシェルがインストールされているか、少なくともkshまたはbash(POSIXに非常に近い)がインストールされていますが、/ bin / shにはさらに制限されたシェルがあります
その理由は、古いsh
コマンドを期待する古いシェルスクリプトが引き続き機能するようにするためです。
文字が好きなので{
、}
と!
のbashにとって特別な意味を持っている、それは(それらをエスケープせずに)それらの文字を使用して、古いシェルスクリプトが失敗する可能性があります。
(Bourneシェルは!!{1,2}
文字どおりになりますが、bashはそれを前のコマンド(!!
)の後にブレース拡張が続くものと解釈します)。
ただし、Linuxでは、sh
コマンドはほとんどの場合bash
、すべての機能を備えたへの単なるリンクです。
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用のスクリプトを書く方が簡単だと思います。
多くのシステム、特にSolarisでは、bashは動的にリンクされ、shは静的にリンクされます。これはセキュリティ上の脅威になる可能性があります。そのため、rootユーザーはシェルとして/ bin / shのみを使用する必要があります(rootとしてログインする必要がある場合)。
ldconfig
たり、/lib
何らかの理由でディレクトリが消去されたりした場合に、緊急時に役立ちます。
sh
およびだけでなくbash
):http