`sh`コマンドの目的は何ですか?


6

shインタラクティブに使用するとき、およびbashスクリプト内で使用するときのコマンドの目的は何ですか?

ハッシュバンライン(最初のライン)以外は、bashシステムでsh置き換える必要がありbashますか?

例:

#!/bin/bash
sh -c "command"

3
質問ごとに1つだけ質問してください:P
Der Hochstapler


1
質問は同様のシェルコマンドに等しく適用されるため、重複していません。
H2ONaCl

回答:


12

たくさんの質問...一度に一つずつ取り上げます。

1)インタラクティブに使用する場合のshコマンドの目的は何ですか?新しい環境コンテキストを提供します。そのため、環境変数の設定を試してみたい場合は可能です。そして、あなたが終わったとき、exit外に出ても害はありません。

また、zshやcshのような別のシェルにいて、shシェルで実行したい場合、これはあなたを切り替えます。

2)上記のようにbashスクリプトで使用すると、「コマンド」を実行するために含まれる環境コンテキストが再び提供されます。

#!/bin/bash
sh -c "command" &
「コマンド」を分岐して、スクリプトの残りの部分と並行して実行します。

3)それが特に必要なものである場合bash、ハッシュバンラインに明示的に配置します。ただし、ほとんどの* nixシステムshはと同等であるためbash、おそらく必要ありません。


あなたの#3は質問に答えると思います:「#!/bin/bash後のシステムで必要ですか?」そしてあなたの答えはノーです。bash代わりに必要かどうかについてはsh、bashが特に必要な場合にのみ答えが得られることを意味していると思います。
H2ONaCl

2
「後で」にはDashを使用しているため、Debianとその派生物は含まれていません。その/bin/shため、これが当てはまらないシステムのかなりの割合です。
ダニエルアンダーソン

1
あなたの答え「2)」に関しては、コマンドに直接sh -c追加&するだけで、コンストラクトなしでこれを行うことができます。
ダニエルアンダーソン

1
まあ、フォークをオフにして並列に実行します、はい。独立した環境で実行するには、いいえ。
pottsdl

1
@pottsdl:[comment -2]:はい、しかし、sh -cあなたのコメントでも言ったように、この部分は並行して実行する可能性を増すことはないので、私の目には言及する必要はありませんでした。それは間違っていませんが、質問自体とは関係ありません。
ダニエルアンダーソン

7

実行するとshどうなりますか?

単にshシェルで起動する場合、現在のシェル内で別のシェルを起動します

shスクリプトで使用するとどうなりますか?

同じことで、スクリプトを処理しているシェル内で別のシェルを起動します。

それがとにかく指す/bin/bashものである場合、私は単に使用する必要があり/bin/shますか?

いいえ。スクリプトが任意のシェルで動作するように設計されている場合、すべてのシェル間の最小公分母に対して動作するように設計されています(私の理解では、これはPOSIX標準の一部です)。特定のインタープリターに
変更することは有害ではありません(すべてのインタープリターが同じ標準に準拠しているため)が、互換性は低下しますが、メリットはまったくありません。

だから、私は常に使用する必要があります/bin/shか?

通訳として

いいえ。スクリプトを自分で記述している場合、そのインタープリターが使用したい追加機能を提供していれば、より具体的なインタープリター(bashなど)を使用することもできます。ただし、スクリプトを使用するすべてのユーザーは、選択したインタープリターが必要になることに注意してください。

別のプロセスを開始するには

独自のコンテキストで新しいプロセスを単に開始する場合は、必ず、を使用します/bin/sh

それで、すべてのポイントは何ですか?

独自のコンテキストで何かを実行する場合は、新しいシェルで実行する必要があります。
それを実現する最も簡単な方法は、新しいシェルを開始し(を使用sh)、コマンドをそれに渡すことです。

何かが特定のシェル用に特別に作成されたスクリプトでない限り、特定のシェルを呼び出す理由はありません。を使用して、任意のシェルを呼び出すだけshです。

でのみ使用可能な特別な構文を使用するスクリプトがある場合はbash、それに応じてシェバンを設定する必要があります。


2
場合でもbashsh同じプログラムですあなたのシステムに同じですが、bashより多くのように動作するはずですshよりもbashその名前で呼び出された場合。shセマンティクスを使用するスクリプトは、bash拡張機能を使用するスクリプトよりも移植性があります。
BillThor

3

shはシェルコマンドではなく、呼び出しているプログラムです。あなたの行はshあなたのパスで検索します。ほとんどの場合/bin/sh、パスにあるどちらかを実行するだけです。

これにより、新しいプロセスが開始されます。

/bin/shbashであることが保証されていません。現在、多くのシステムbashにありますが、いくつかのUnixシステムではBourneシェルです。実行する/bin/shと、POSIX標準に準拠したシェルが期待できます。


そしてその目的は...?
H2ONaCl

この例では、コマンドとして引数を使用して(強制的にbashではなく)シェルを開始します。別のプロセスとして実行されます(異なるメモリ空間、デタッチの可能性、...)
Matteo

3

なぜ/ 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は素晴らしいです。

http://tldp.org/LDP/abs/html/

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システムのデフォルトのシステムシェルとして使用されます。

ホームページ:

http://gondor.apana.org.au/~herbert/dash/


2

1)シェルです。対話モードでの目的は、ユーザーからの入力を読み取り、指定されたコマンドを実行することです。非対話型モードでは、スクリプトファイルからすべてのコマンドを読み取るため、ユーザーがキーボードに触れることなく動作します。

2)スクリプトファイルの "sh -c command"と単なる "command"の違いは、前者の場合、コマンドは別のシェルプロセスから分岐するのに対し、後者の場合、メインシェルスクリプトを実行するプロセスから分岐する(つまりそのファイル記述子、環境などにアクセスできます)。したがって、前者のプロセスツリーには追加のプロセスがあり、ある程度の分離もあります。

3)/ bin / shは(たとえば)/ bin / zshへのシンボリックリンクである可能性があるため、bashメインスクリプトからbash子スクリプトを実行する場合は、明示的に「bash -c」と指定する必要があります。子スクリプトがシェルに依存しない場合、「sh -c」も同様に機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.