2つのタイプのコードが使用されているのがわかります。
#!/usr/bin/sh
そして:
#!/user/bin/bash
私はこれをオンラインで検索しましたが、意見はさまざまです。ほとんどのWebサイトで私が見た説明では、sh
はbash
よりも古く、実際の違いはないということです。
誰かがこれらの違いを知っていますか?どちらを使用するかについての実用的な例を教えていただけますか?
bash
はsh
のスーパーセットです。 sh
でできることすべてbash
でできること。
Bashにはより多くの機能(分岐、組み込み、配列)があり、スクリプトを簡単に記述できます。いくつかの* nixには/bin/sh
へのリンクとして/bin/bash
何の完全な説明については ここにチュートリアルがあります
従来、/ bin/shは、履歴もコマンドライン編集もジョブ制御もない元のBourne Shellでした。
過去15年間ほど、ほとんどのUnixにPOSIXシェル、または少なくともkshまたはbash(これはPOSIXに非常に近い)がインストールされていますが、それでも/ bin/shに制限されたシェルがあります
その理由は、古いsh
コマンドを期待する古いシェルスクリプトが引き続き機能するためです。{
、}
および!
bashに特別な意味があります。それらの文字を(エスケープせずに)使用する古いシェルスクリプトが失敗する可能性があります。
(ボーンシェルは!!{1,2}
文字通り、bashはそれを前のコマンド(!!
)に続いて中括弧展開)。
ただしLinuxでは、sh
コマンドはほとんどすべての機能が同じで、bash
へのリンクにすぎません。
shは、Bourne Shellまたは/ bin/shのいずれかを意味します。これは、最新のほとんどのプラットフォームにおける他の(POSIX準拠の)シェルです。 「POSIXシェル」は抽象 POSIXによって定義されたシェル であり、POSIXモードのbash、またはデフォルトでkshまたはdashによって実装されます。/bin/shは、ほとんどのプラットフォームでPOSIXに準拠するシェルであるため、POSIXシェルとも呼ばれます。オリジナルのBourneシェルはPOSIXシェルではありません。
bashrefには bashシェルとBourneシェルの違い のリストがあります。 man bash
には POSIXモードで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
man bash :
Bashがshという名前で呼び出された場合、POSIX標準にも準拠しながら、shの過去のバージョンの起動時の動作をできるだけ模倣しようとします。
それ以外の場合、ボーンシェルの模倣はかなり制限されます。 bash +B
(ボーン)は、ブレース拡張などの機能を実際に無効にします。
$ sh
$ echo {a,b}
a b
$ echo $BASH_VERSION
3.2.48(1)-release
$ bash +B
$ echo {a,b}
{a,b}
ただし、POSIXモードを無効にしても、echoはデフォルトでecho -e
のように動作します。
$ sh
$ shopt -uo posix
$ echo '1\b2'
2
/ bin/shは bunt のダッシュなので、一部の bashisms はOS Xの/ bin/shで動作しますがUbuntuでは動作しません。
実際に元のBourneシェル(のようなもの)用のスクリプトを書きたい場合は、代わりに#!/usr/bin/env bash +B
を使用できます。
POSIX仕様やBourneシェルの一部ではない機能を回避したり、他のシェルですべてをテストしたりするよりも、bash用のスクリプトを書く方が簡単だと思います。
多くのシステム、特にSolarisでは、bashは動的にリンクされ、shは静的にリンクされます。これはセキュリティ上の脅威をもたらす可能性があります。このため、rootユーザーは/ bin/shをシェルとしてのみ使用する必要があります(rootとしてログインする必要がある場合)。
実際には、/ bin/shが/ bin/bashへのリンクである場合でも、shとして起動した場合は動作が異なります。 bashのマンページから:
Bashがshという名前で呼び出された場合、POSIX標準にも準拠しながら、shの過去のバージョンの起動時の動作をできるだけ模倣しようとします。
したがって、sh
と同様に、歴史的なshの動作をエミュレートしようとします。 bash
と同様に、対話型ログインシェルと同じくらい役立つようにしています。