どのような状況でプログラムを直接実行するのではなく、「sh -c」を使用する必要がありますか?

どのような状況でプログラムを直接実行するのではなく、「sh -c」を使用する必要がありますか?

これはよく見ます。

sh -c "curl -o …"

単に使用するよりもどのような状況で使用する必要がありますか?

curl -o …

ベストアンサー1

一般的に避けることができればそうしないでしょう。 2つの例は基本的に同じです。

しかし、これはプロセス内でシェル演算子を使用する比較的一般的なパターンです。たとえば、リダイレクト演算子>またはパイプを使用します|

2つの間に微妙な違いがあります。

curl -o example.com/foo > foo
sh -c "curl -o example.com/foo > foo"

まず、現在のコマンドラインシェルはファイルを生成し、fooファイルに開いたファイルハンドルをリンクします。 2番目は、ファイルの作成とカールへの接続をcurl担当する新しいシェルプロセスを作成します。foo

なぜこれが必要なのでしょうか?

特権

これは、現在のシェルで異なる制約を持つコマンドを実行するときに重要になります。たとえば、sudo現在のシェル以外のユーザーでコマンドを実行します。だからこの二人は本物その他:

sudo curl -o example.com/foo > foo
sudo sh -c "curl -o example.com/foo > foo"

最初のケースでは、ファイルはfoo現在のシェルで開かれているため、ユーザーが開くか作成します。

第二に、ユーザーはroot無制限のアクセスでファイルを開いたり生成したりします。

遅延シェル拡張

もう一つの理由は、変数の拡張が遅れているためです。有用な例はありません。ただし、まれに、拡張変数の時間/位置を遅らせると便利です。

hello=wave
echo $hello
hello=wave
sh -c 'echo $hello'

変数がhelloエクスポートされないshため、シェルでは使用できないため、実際には別の結果が生成されます。

おすすめ記事