sh
インタラクティブに使用するとき、およびbashスクリプト内で使用するときのコマンドの目的は何ですか?
ハッシュバンライン(最初のライン)以外は、bashシステムでsh
置き換える必要がありbash
ますか?
例:
#!/bin/bash
sh -c "command"
sh
インタラクティブに使用するとき、およびbashスクリプト内で使用するときのコマンドの目的は何ですか?
ハッシュバンライン(最初のライン)以外は、bashシステムでsh
置き換える必要がありbash
ますか?
例:
#!/bin/bash
sh -c "command"
回答:
たくさんの質問...一度に一つずつ取り上げます。
1)インタラクティブに使用する場合のshコマンドの目的は何ですか?新しい環境コンテキストを提供します。そのため、環境変数の設定を試してみたい場合は可能です。そして、あなたが終わったとき、exit
外に出ても害はありません。
また、zshやcshのような別のシェルにいて、sh
シェルで実行したい場合、これはあなたを切り替えます。
2)上記のようにbashスクリプトで使用すると、「コマンド」を実行するために含まれる環境コンテキストが再び提供されます。
#!/bin/bash
sh -c "command" &
「コマンド」を分岐して、スクリプトの残りの部分と並行して実行します。
3)それが特に必要なものである場合bash
、ハッシュバンラインに明示的に配置します。ただし、ほとんどの* nixシステムsh
はと同等であるためbash
、おそらく必要ありません。
#!/bin/bash
後のシステムで必要ですか?」そしてあなたの答えはノーです。bash
代わりに必要かどうかについてはsh
、bashが特に必要な場合にのみ答えが得られることを意味していると思います。
/bin/sh
ため、これが当てはまらないシステムのかなりの割合です。
sh -c
追加&
するだけで、コンストラクトなしでこれを行うことができます。
sh -c
あなたのコメントでも言ったように、この部分は並行して実行する可能性を増すことはないので、私の目には言及する必要はありませんでした。それは間違っていませんが、質問自体とは関係ありません。
sh
どうなりますか?単にsh
シェルで起動する場合、現在のシェル内で別のシェルを起動します。
sh
スクリプトで使用するとどうなりますか?同じことで、スクリプトを処理しているシェル内で別のシェルを起動します。
/bin/bash
ものである場合、私は単に使用する必要があり/bin/sh
ますか?いいえ。スクリプトが任意のシェルで動作するように設計されている場合、すべてのシェル間の最小公分母に対して動作するように設計されています(私の理解では、これはPOSIX標準の一部です)。特定のインタープリターに
変更することは有害ではありません(すべてのインタープリターが同じ標準に準拠しているため)が、互換性は低下しますが、メリットはまったくありません。
/bin/sh
か?いいえ。スクリプトを自分で記述している場合、そのインタープリターが使用したい追加機能を提供していれば、より具体的なインタープリター(bashなど)を使用することもできます。ただし、スクリプトを使用するすべてのユーザーは、選択したインタープリターが必要になることに注意してください。
独自のコンテキストで新しいプロセスを単に開始する場合は、必ず、を使用します/bin/sh
。
独自のコンテキストで何かを実行する場合は、新しいシェルで実行する必要があります。
それを実現する最も簡単な方法は、新しいシェルを開始し(を使用sh
)、コマンドをそれに渡すことです。
何かが特定のシェル用に特別に作成されたスクリプトでない限り、特定のシェルを呼び出す理由はありません。を使用して、任意のシェルを呼び出すだけsh
です。
でのみ使用可能な特別な構文を使用するスクリプトがある場合はbash
、それに応じてシェバンを設定する必要があります。
bash
とsh
同じプログラムですあなたのシステムに同じですが、bash
より多くのように動作するはずですsh
よりもbash
その名前で呼び出された場合。sh
セマンティクスを使用するスクリプトは、bash
拡張機能を使用するスクリプトよりも移植性があります。
sh
はシェルコマンドではなく、呼び出しているプログラムです。あなたの行はsh
あなたのパスで検索します。ほとんどの場合/bin/sh
、パスにあるどちらかを実行するだけです。
これにより、新しいプロセスが開始されます。
/bin/sh
bashであることが保証されていません。現在、多くのシステムbashにありますが、いくつかのUnixシステムではBourneシェルです。実行する/bin/sh
と、POSIX標準に準拠したシェルが期待できます。
なぜ/ bin / sh ??
他の人が指摘したように、あなたはそれが実際に何を意味するかを決めることができます:)(またはあなたのディストリビューションがあなたのためにします。)
少なくともbashには特定の意味があります...
bashのmanページから:
「bashがshという名前で呼び出された場合、POSIX標準にも準拠しながら、shの履歴バージョンの起動時の動作を可能な限り模倣しようとします。」
したがって、/ bin / shが/ bin / bashを指している場合、その動作が得られます。
#!/ bin / bash
「標準」bash (およびその「bashisms」)を提供します
もちろん、/ bin / shは実際には/ bin / dashまたはkshまたは他の「シェル」と言うリンクになります。
bashのmanページは巨大ですが、この特定の情報は...のみで145行です:)
いくつかの良い紹介があります:Advanced Bash Scripting Guideは素晴らしいです。
Debian / Ubuntu(またはその他の派生物)の場合:
abs-guide-高度なBashスクリプトガイド
debian-reference-en-> Debianシステム管理ガイド、英語原文
例えば
apt-get install abs-guide
参考までに:(説明まで編集)
$ apt-cache show dash
言う:
Description-en:POSIX準拠のシェルDebian Almquistシェル
(ダッシュ)は、ashから派生したPOSIX準拠のシェルです。。
bashよりも高速にスクリプトを実行するため、
ライブラリの依存関係が少ない
(ソフトウェアまたはハードウェアの障害に対してより堅牢にする)、
Debianシステムのデフォルトのシステムシェルとして使用されます。
ホームページ:
1)シェルです。対話モードでの目的は、ユーザーからの入力を読み取り、指定されたコマンドを実行することです。非対話型モードでは、スクリプトファイルからすべてのコマンドを読み取るため、ユーザーがキーボードに触れることなく動作します。
2)スクリプトファイルの "sh -c command"と単なる "command"の違いは、前者の場合、コマンドは別のシェルプロセスから分岐するのに対し、後者の場合、メインシェルスクリプトを実行するプロセスから分岐する(つまりそのファイル記述子、環境などにアクセスできます)。したがって、前者のプロセスツリーには追加のプロセスがあり、ある程度の分離もあります。
3)/ bin / shは(たとえば)/ bin / zshへのシンボリックリンクである可能性があるため、bashメインスクリプトからbash子スクリプトを実行する場合は、明示的に「bash -c」と指定する必要があります。子スクリプトがシェルに依存しない場合、「sh -c」も同様に機能します。