bashとshはスクリプトを別々に実行しますか? bashとshを使ってシェルスクリプトを実行し、同じ出力を得ました。では、違いは何ですか?
また、ちょうど実行したときに./executable
bashまたはshを使用しましたか?
答え1
これは実行中のシステムによって異なります。多くのオペレーティングシステム、特にLinuxベースのオペレーティングシステムsh
ではbash
。
この場合、動作にはまだわずかな違いがあります。bash
呼び出すと、伝統的なBourneシェルに似ていますsh
が、まだほとんどのbashismを許可します。
Debianベースのオペレーティングシステムなど、他の一部のオペレーティングシステムでは代わりにsh
提供されています。これは、bashismをサポートせずにきちんとしたPOSIXシェル実装で設計されているため、より大きな違いを生み出します。dash
bash
dash
たとえば、sh
通常、POSIX 準拠によって提供される独自のオペレーティング システムでは bashism は実装されません。 Solaris 10以前では、PATHによっては、POSIX以前のBourneシェルになる可能性があります。ksh88
dash
sh
bash
それにもかかわらず、スクリプトは特定のコマンド、オプション、または構文を使用しないため、テストと同じ出力を取得できます。
を実行すると、./executable
どのシェルが実行されるかは、デフォルトで.executableスクリプトの先頭に作成されたshebangによって異なります。bash
shebangがこれを指定した場合:
#!/bin/bash
....
Shebangがなく、POSIX準拠のシェルからスクリプトを呼び出す場合、技術的には、スクリプトはsh
PATHの最初のスクリプトによって実行する必要があります。多くのシェルインタプリタはPOSIXを好み、bash
考慮しdash
てksh
スクリプトを解釈します。ここではSHELL
環境変数は使用されません。
答え2
はい、できますが、必ずしもそうではありません。両方のシェルは互いに異なりますが、デフォルトでは互換性があります。確認するこの投稿詳細については。
スクリプトで次の行を使用して、どのインタプリタが使用されているかを確認できます。
ps h -p $$ -o args='' | cut -f1 -d' '
次の行を使用して、スクリプトを直接実行するときに使用する必要があるシェルを明示的に指定できますsheebang
。
#!/bin/sh
または
#!/bin/bash