回答:
shshインタープリターとしてプログラムを呼び出し、-cフラグはこのプログラムによって解釈された次のコマンドを実行することを意味します。
Ubuntuでは、sh通常にシンボリックリンクされます/bin/dash。つまりsh -c、ダッシュシェルでコマンドを実行すると、bashの代わりにコマンドが実行されます。withで呼び出されるシェルはsh、シンボリックリンクに依存します-で調べることができますreadlink -e $(which sh)。sh -cbashの代わりに、そのシェルでコマンドを実行する場合に使用する必要があります。
この構文(-cフラグ)を他のインタープリターでも使用できます。古典的な使い方の1つ(@edwinkslが指摘するのは、リダイレクトがsudoで機能しないという問題を回避することです(ここでは、bash -cまたはを使用できますsh -c)
sudo sh -c 'echo "foo" > /home/bar'
ファイル書き込みますbarテキスト含むfooのを/home/しながら、sudo echo "foo" > /home/bar失敗したここに非常によく説明したように
コマンド文字列の周りに「単一引用符」を使用することが重要です。そうしないと、現在のシェルは、呼び出したインタープリターに渡される前にそれを展開しようとします
例えば(ダッシュで異なる結果を与えるコマンドを考えるまでPythonで...)
$ python3 -c print (35/7)
bash: syntax error near unexpected token `('
$ python3 -c 'print (35/7)'
5.0
-c引数は次のとおりです。
標準入力からではなく、command_stringオペランドからコマンドを読み取ります。特別なパラメーター0はcommand_nameオペランドから設定され、位置パラメーター($ 1、$ 2など)は残りの引数オペランドから設定されます。
sh荷物のその他の詳細は、次を実行して見つけることができます。
$ man sh
引数として文字列を使用する例は次のとおりです。
$ sh -c "echo This is a test string"
これはより詳細なsh -c例です。Googleドライブからドキュメントをダウンロードし、デスクトップで編集するために開きます。
$ sh -c "wget 'https://docs.google.com/document/u/0/d/1jcBtdlMx0f4BhCmAmnIViIy4WN4oRevWFRzse-P00j0/export?format=docx' -O test.docx && xdg-open test.docx 2>/dev/null"
sh -c(非 Ubuntu)の非ログイン、非対話型セッションを生成します。shdash
そのシェル・セッションで実行されるコマンド以下は、それが0(引数(位置パラメータ)として扱われるARGV0)、及びそのコマンドの引数(、残りの部分ARGV01から出発して、() ARGV1、ARGV2...)。
この種のセッションで実行できる一般的なシェル機能を使用することもできます。たとえば;、複数のコマンドを使用するコマンドの分離、使用するコマンドのグループ化、を使用した{}別のサブシェルの生成()などです。これらを使用すると、前述の引数の定義/例がわずかに変更される可能性があります。
ただ、ノートに、固有の機能の対話型のみ(デフォルト)シェル、例えば履歴展開、sourceの-ing ~/.bashrcと/etc/bash.bashrcそのままなどがこのセッションで使用することはできません非対話型。次の-iオプションを使用して、インタラクティブセッションの動作を(ほぼ)シミュレートできます。
sh -ic ...
同様に、ログインシェルのみに固有の機能(デフォルト)は、たとえばsource-ing of ~/.profile(指定され~/.bash_profile、~/.bash_login存在しない)であり/etc/profile、シェルは非ログインシェルであるため実行されません。-lオプションを使用して、ログインシェルの動作をシミュレートできます。
sh -lc ...
ログインセッションとインタラクティブセッションの両方をシミュレートするには:
sh -lic ...
sh -cか?の-c部分に記載されている位置パラメータの割り当てを示している場合は、さらに便利ですman sh。