bashとshはスクリプトの実行方法が異なりますか? bashとshの両方を使用してシェルスクリプトを実行したところ、同じ出力が得られました。では、違いは何ですか?
また、./executable
を実行するとき、bashまたはshを使用しますか?
コメント
回答
これは実行しているシステムによって異なります。多くのOS、特にLinuxベースのOSの1つであるsh
は、bash
へのリンクです。
このような場合、 bash
がsh
と呼ばれると、従来のボーンシェルのようにしようとする動作にはまだいくつかの違いがありますが、それでもほとんどのバシズムを受け入れます。
DebianベースのOSなど、他の一部のOSでは、sh
はivid = “ではなく、dash
によって提供されます。 e34c827e9a “>
。 dash
はbashismをサポートしておらず、クリーンなPOSIXシェル実装として設計されているため、これははるかに大きな違いになります。
プロプライエタリOSでは、sh
は、POSIX準拠のksh88
によって提供されることが多く、dash
のようにバシズムを実装していません。 Solaris 10以前では、PATHの内容によっては、sh
がPOSIXよりも前のレガシーBourneシェルになる可能性があります。
いずれの場合も、スクリプトがbash
固有のコマンド、オプション、または構文を使用していなかったという理由だけで、テストと同じ出力が得られます。
、どのシェルが実行されるかは、基本的に.executableスクリプトの先頭に記述されたシバンに依存します。シバンで指定されている場合はbash
になります:
#!/bin/bash ....
シバンがなく、スクリプトを呼び出す場合POSIX準拠のシェルから、スクリプトは技術的にはPATHで最初に見つかったsh
によって実行される必要があります。 bash
、dash
、ksh
などの多くのシェルインタープリターは、自分たちをPOSIXと見なしています。スクリプトを解釈します。 SHELL
環境変数はここでは使用されていないことに注意してください。
コメント
- で見回しましたdiv id = “3420465ea1″>
で、sh
はivid =ではなく、dash
へのシンボリックリンクであることがわかりました。 “e34c827e9a”>
。では、どのように同じように実行されたのでしょうか。 '実際にはbashスクリプトコマンドを実行していませんでした。他のパッケージを使用するためのターミナルコマンドだけでした'ツール。
bash
の違いは何ですか。およびdash
?dash
はPOSIXシェル標準のクリーンな実装です。一方、bash
は、非常に多くの拡張機能と非標準機能を備えたシェルであり、ksh
、およびその他のシェル、およびbashismとして知られるbash固有の一部。特定のシェルスクリプトで厳密に移植できないものすべてを識別するのに役立つcheckbashismsという名前のツールがあります。
回答
はい、可能性はありますが、そうである必要はありません。 2つのシェルは同じではありませんが、基本は互換性があります。詳細については、この投稿を確認してください。
スクリプトで次の行を使用して、使用されているインタプリタを確認できます。
ps h -p $$ -o args="" | cut -f1 -d" "
sheebang
行を使用して、スクリプトを直接実行するときに使用するシェルを明示的に指定できます。
#!/bin/sh
または
#!/bin/bash
$SHELL
変数は、どのシェルが./executable
を解釈するかを決定するために使用されません。脚本。 '必ずしも現在のシェルが何であるかを示すわけではありません。