このDockerfileエントリポイントで "set --"は何をしますか?

このDockerfileエントリポイントで "set --"は何をしますか?

これが何かを理解しようとしています。Dockerエントリポイントは次のことを行います。

これはDockerfileを書くときに非常に一般的なパターンのようですが、私のbash技術は限られており、特別なbash表記法のトリックをすべて知りません。

また、「--」、「$!」などを検索するのも難しいです。 bashの世界ではこれを何と呼びますか?

全体的に、次のコード行は何をしようとしていますか?

if [ "${1#-}" != "$1" ]; then
  set -- haproxy "$@"
fi

答え1

このsetコマンド(オプションが設定されていない場合)は、位置引数を設定します。

$ set a b c
$ echo $1
a
$ echo $2
b
$ echo $3
c

これが--「以後は何もオプションとして扱わない」という基準だ

これは"$@"すべて既存の場所パラメータです。

だから注文は

set -- haproxy "$@"

haproxyなどの前にこの単語を入れます。$1 $2

例えば

$ echo $1,$2,$3
a,b,c
$ set -- haproxy "$@"
$ echo $1,$2,$3,$4   
haproxy,a,b,c

答え2

これコマンド設定オプション(フラグ付き)とパラメータのサポート

set [-abefhkmnptuvxBCEHPT] [-o option-name] [--] [-] [argument …]
  • optionsコマンドの動作方法(ファイル名の解釈方法など)を変更するために使用できます。
  • argumentsコマンドに何をすべきかを伝えます。つまり、ユーザー入力

たとえば、set コマンドにはオプションがあります。

-a:生成または変更されたすべての変数または関数にはエクスポート属性が付与され、後続のコマンド環境にエクスポートするために表示されます。

実行時:

$ set -a 12; echo $1
12

$1に設定されていますが、コマンドによって消費されていることがわかります12-aset

本当にas(and as)-aに設定したい場合(つまり、後ろのすべては引数です)を使用して、オプションの処理を停止するようにコマンドに指示できます。$112$2--set

$ set -- -a 12; echo $1 $2
-a 12

関連情報