"[email protected]"
bit は位置パラメータ (通常はコマンド ライン引数) のリストに展開され、単語の分割とファイル名の生成 (「グロビング」) を避けるために個別に引用されます。
exec
現在のプロセスを、その引数を実行した結果のプロセスに置き換えます。
つまり、exec "[email protected]"
現在のプロセスがそれによって置き換えられるような方法で、コマンド ライン パラメータによって指定されたコマンドを実行します (exec
コマンドを実行できます)。
exec "[email protected]"
について説明する他の 2 つの回答 します。 Stack Overflow に関するこの回答は、なぜ Docker にとって重要なのかを説明しています。ご想像のとおり、これはシグナルと関係があります。
これは、Docker でシグナルが正しくプロキシされるために重要です。たとえば、Redis が exec
なしで起動された場合 、SIGTERM
を受け取りません docker stop
時 きれいにシャットダウンする機会がありません。場合によっては、これがデータ損失やゾンビ プロセスにつながる可能性があります。
子プロセスを開始する場合 (つまり、 exec
を使用しないでください) )、親プロセスは、必要に応じてシグナルの処理と転送を担当します。これが、supervisord
を使用するのが最適な理由の 1 つです。 シグナルを適切に転送するため、コンテナ内で複数のプロセスを実行する場合と同様です。
"[email protected]"
Bourne のようなシェルでは、リスト コンテキストでは、すべての位置パラメータが個別の引数として展開されます。
スクリプトでは、最初は、位置パラメータはスクリプト自体が受け取った引数です。
exec
シェルと同じプロセスでコマンドを実行することです。これは、スクリプトが実行する最後のコマンドです。その後、プロセスはシェル以外のコマンドを実行するためです。
あなたのスクリプトが
#! /bin/sh -
exec "[email protected]"
そして、次のようなシェル コマンド ラインを使用してスクリプトを呼び出します。
/path/to/your-script 'echo' "some test" 'x y'
exec
を呼び出します echo
で 、 some test
、および x y
echo
を実行する引数として (ほとんどの sh
で 実装、/bin/echo
echo
とは対照的に shell builtin) 以前にシェルを実行していたのと同じプロセスで、 some test
でスクリプトを解釈します と x y