コンピューティングにおいて、コマンド置換とは、コマンドを実行し、その出力を別のコマンドの引数としてコマンドラインに貼り付けることができる機能です。コマンド置換は、 1979 年にバージョン 7 Unixで導入されたBourne シェル[ 1 ]で初めて登場し、それ以降のすべてのUnix シェルの特徴となっています。この機能は、 Perl、PHP、Ruby 、 Windows上のMicrosoft PowerShellなど、他のプログラミング言語にも採用されています。また、Microsoft のCMD.EXEのコマンドとコマンドにも登場します。FOR( )
シェルは通常、コマンド置換を実装する際に、子プロセスを作成して最初のコマンドを実行させ、その標準出力 をシェルにパイプで送り返します。シェルはその出力を読み取り、空白で区切られた単語に解析します。シェルは、パイプが閉じられるか子プロセスが終了するまで、子プロセスからの出力がすべて揃ったかどうかを知ることができないため、2番目のコマンドを実行するための別の子プロセスを開始する前に、それらの処理が完了するまで待機します。
このCシェルの例では、文字列を含むすべてのCファイルを検索し、見つかったファイルをエディタで編集する方法を示しています。ここで示されている構文表記(バッククォートを区切り文字として使用)は、オリジナルのスタイルであり、一般的なUnixシェルすべてでサポートされています。mallocfgrepvi` `
#!/bin/csh vi ` fgrep -l malloc *.c `構文(型の付け方)と意味論(動作原理)の両方について異議が唱えられている。
入力は簡単で、対話型コマンドプロセッサにとって重要な要素ではあるものの、左と右の区切り文字が同じであるため、コマンド置換をネストして別のコマンド置換の中に入れるのが難しいという批判を受けてきた。[ 2 ] KornShell (ksh) [ 3 ]は、変数置換に使用される表記スタイルを借用した別の表記法、...でこの問題を解決した。現在、ほとんどの UNIX シェルはこの構文をサポートしている。Microsoft のPowerShellも同じ意味論でこの表記法を使用している。$( )
#!/bin/bash vi $( fgrep -l malloc *.c )空白で出力を単語に分割する意味論も批判されている。ファイル名にスペースが含まれない初期のUnixシステムではうまく機能したが、ファイル名にスペースが含まれる可能性がある現代のWindowsやLinuxシステムでは全くうまく機能しない。 [ 4 ] 上記の例のいずれにおいても、*.cワイルドカードに一致するファイル名のいずれかにスペースが含まれている場合、そのファイル名は の 2 つの別々の引数に分割されvi、明らかに意図したものではない。Hamilton C シェルは、二重バッククォート表記`` ...を使用してこれを解決し、行の区切りでのみ単語に解析する。[ 5 ] ``
これは、 PowerShell()で演算子を使用したコマンド置換の例です。
$MyVariable = ( ls ) echo $MyVariable関連する機能である式置換は、 Common LispおよびScheme言語にあり、バッククォート (または「準クォート」) 演算子でマークされた式でカンマアット演算子を使用することで呼び出されます。また、 ABCでは、テキスト表示 (文字列リテラル)内のバッククォートで囲まれた式を使用することで呼び出されます。たとえば、ABC コマンドはWRITE '2 + 2 = `2+2`'次の出力を生成します2 + 2 = 4。
コマンド置換の構文は次のとおりです。括弧内のコマンドが実行され、コマンドが標準出力 (および標準エラー) に書き込んだ内容が式の値として返されます。 $(Unix command) ファイル名にスペースが含まれるのは忌まわしいことですが、今日では非常に一般的であるため、スクリプトはその可能性(あるいは必然性と言うべきでしょうか?)を考慮に入れなければなりません。...コマンド置換の結果は単語分割の対象となります。