シェルプログラムを書くとき、/bin/sh
と をよく使います/bin/bash
。私はたいてい を使うのですbash
が、それらの違いがわかりません。
Bash と の主な違いは何ですかsh
?
Bash でプログラミングするときに注意する必要があることは何ですかsh
?
ベストアンサー1
shとは何ですか?
sh
(またはシェルコマンド言語)は、POSIX標準さまざまな実装があります(ksh88
、ダッシュsh
、...)。Bash は、 (下記参照)の実装とも考えられます。
sh
これは実装ではなく仕様であるため、/bin/sh
ほとんどの POSIX システム上の実際の実装へのシンボリック リンク (またはハード リンク) になります。
Bashとは何ですか?
Bash はsh
互換実装として始まりました (POSIX 標準より数年前のものですが) が、時が経つにつれて多くの拡張機能が追加されました。これらの拡張機能の多くは有効な POSIX シェル スクリプトの動作を変更する可能性があるため、Bash 自体は有効な POSIX シェルではありません。むしろ、POSIX シェル言語の方言です。
Bash は--posix
スイッチをサポートしており、これにより POSIX 準拠性が高まります。 として呼び出された場合も、POSIX を模倣しようとしますsh
。
sh = bash?
長い間、ほとんどの GNU/Linux システムでは/bin/sh
を指していました/bin/bash
。その結果、両者の違いを無視してもほぼ安全になりました。しかし、最近になって状況が変わり始めました。
/bin/sh
が指していないシステム/bin/bash
(/bin/bash
存在しないシステムもある)の一般的な例は次のとおりです。
- デフォルト
sh
でシンボリックリンクする最新の Debian および Ubuntu システム。dash
- ビジーボックスこれは通常、Linuxシステムの起動時に の一部として実行されます
initramfs
。灰シェルの実装。 - BSDA のシステム、および一般に Linux 以外のシステム。オープンBSD
pdksh
の子孫であるコーンシェルFreeBSD はsh
オリジナルの Unix Bourne シェルの後継です。ソラリス独自の実装がありますsh
が、長い間POSIXに準拠していませんでした。無料の実装は家宝プロジェクト。
/bin/sh
システム上のポイントを確認するにはどうすればよいでしょうか?
問題は、それが/bin/sh
シンボリックリンクかハードリンクである可能性があるということです。シンボリックリンクの場合は、ポータブル解決方法は次のとおりです。
% file -h /bin/sh
/bin/sh: symbolic link to bash
ハードリンクの場合は、
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
実際、この-L
フラグはシンボリックリンクとハードリンクの両方をカバーしますが、この方法の欠点は移植性がないことです — POSIX必要ありません find
-samefile
両者ともその選択肢を支持するが、GNU検索そしてFreeBSD 検索それをサポートします。
シェバンライン
最終的には、スクリプトの最初の行として「shebang」行を記述して、どちらを使用するかを決定するのはあなた次第です。
例えば
#!/bin/sh
使用するものsh
(そしてそれが指すもの)
#!/bin/bash
利用可能な場合はそれを使用します/bin/bash
(利用できない場合はエラーメッセージで失敗します)。もちろん、別の実装を指定することもできます。例:
#!/bin/dash
どれを使うか
sh
私自身のスクリプトでは、次の理由からこれを好みます。
- 標準化されている
- はるかにシンプルで簡単に学べます
- POSIXシステム間で移植可能であり、たとえPOSIXシステムが持っていなくても
bash
、sh
bash
使用することでも利点があります。その機能により、プログラミングがより便利になり、他の最新のプログラミング言語でのプログラミングに似たものになります。これには、スコープ付きローカル変数や配列などが含まれます。Plainsh
は非常にミニマルなプログラミング言語です。