スクリプトを実行するためにbashとshを使用することの違いは何ですか?

bashとshはスクリプトの実行方法が異なりますか? bashとshの両方を使用してシェルスクリプトを実行したところ、同じ出力が得られました。では、違いは何ですか?

また、./executableを実行するとき、bashまたはshを使用しますか?

コメント

  • @Pandya $SHELL変数は、どのシェルが./executableを解釈するかを決定するために使用されません。脚本。 '必ずしも現在のシェルが何であるかを示すわけではありません。
  • @jlliagreああ! OK。 wiki.debian.org によると" SHELL =現在のシェル。"
  • @Pandya実際には"ユーザー'のログインシェル"。現在のシェルは異なる場合があります。

回答

これは実行しているシステムによって異なります。多くのOS、特にLinuxベースのOSの1つであるshは、bashへのリンクです。

このような場合、 bashshと呼ばれると、従来のボーンシェルのようにしようとする動作にはまだいくつかの違いがありますが、それでもほとんどのバシズムを受け入れます。

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によって実行される必要があります。 bashdashkshなどの多くのシェルインタープリターは、自分たちをPOSIXと見なしています。スクリプトを解釈します。 SHELL環境変数はここでは使用されていないことに注意してください。

コメント

  • で見回しましたdiv id = “3420465ea1″>

で、shはivid =ではなく、dashへのシンボリックリンクであることがわかりました。 “e34c827e9a”>

。では、どのように同じように実行されたのでしょうか。 '実際にはbashスクリプトコマンドを実行していませんでした。他のパッケージを使用するためのターミナルコマンドだけでした'ツール。

  • シェルスクリプトが他のコマンドを順番に呼び出しているだけの場合、シェルインタープリターは同じ結果でそれを実行します。ここでは予期しないことは何もありません。
  • これは質問とは関係ありませんが、bashの違いは何ですか。およびdash
  • どちらもBourneシェル構文を使用しています。返信で書いたように、dashはPOSIXシェル標準のクリーンな実装です。一方、bashは、非常に多くの拡張機能と非標準機能を備えたシェルであり、ksh
  • およびその他のシェル、およびbashismとして知られるbash固有の一部。特定のシェルスクリプトで厳密に移植できないものすべてを識別するのに役立つcheckbashismsという名前のツールがあります。

    回答

    はい、可能性はありますが、そうである必要はありません。 2つのシェルは同じではありませんが、基本は互換性があります。詳細については、この投稿を確認してください。

    スクリプトで次の行を使用して、使用されているインタプリタを確認できます。

    ps h -p $$ -o args="" | cut -f1 -d" " 

    sheebang行を使用して、スクリプトを直接実行するときに使用するシェルを明示的に指定できます。

    #!/bin/sh 

    または

    #!/bin/bash 

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です