Shell ゼンゼン ヨメナイ
Docker-composeがうまくいかないときに、「とりあえずdocker-entrypoint.shでも読んでみるかー」と思ったけど、全然読めなかった。なんやこれ。
#!/bin/sh
set -euo pipefail
# first arg is `-f` or `--some-option`
if [ "${1#-}" != "$1" ]; then
set -- wp "$@"
fi
# if our command is a valid wp-cli subcommand, let's invoke it through wp-cli instead
# (this allows for "docker run wordpress:cli help", etc)
if wp --path=/dev/null help "$1" > /dev/null 2>&1; then
set -- wp "$@"
fi
exec "$@"
特にわからなかったところをメモで残す。
set -euo pipefail
setでshellのオプションを色々設定しているらしい
[参考]https://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d
eオプションはエラーが発生したら中断
uオプションは未定義の変数をエラーにするもの
oオプションはpipefailとセットで使っていて、パイプの左側のコマンドが死んだときに止まってくれるというもの
https://qiita.com/progrhyme/items/6e522d83de3c94aadec9
if [ "${1#-}" != "$1" ]; then
set -- wp "$@"
fi
これが全然わからなかったので実際に手元で動かして見ると以下のようなことがわかった。
${1#-}
は引数の1番目の文字からハイフンを一つ取り除いたもの。例えば. hoge.sh -a test
と実行したら${1#-}
はaを返す。
なのでif文の意味は「ハイフンが付いていたら」という意味になる。わかりづれぇ。
set -- wp "$@"
これも全然わからなかった。
[参考]https://yash.osdn.jp/doc/ja/_set.html
Set コマンドにオペランドが与えられている場合またはオプションとオペランドを区切るハイフン二つ (--, コマンドの引数の構文参照) がコマンドライン引数に入っている場合は、現在の位置パラメータは削除され、与えられたオペランドがそれぞれ新しく位置パラメータになります。ハイフン二つが与えられていてかつオペランドがない場合は位置パラメータはなくなります。
この文章を5分くらい見つめてようやく理解した。
つまり. hoge.sh -a test
を実行すると$@
は-a test
となるが、 set -- wp "$@"
を実行すると$@
はwp -a test
となるわけだ。
wpコマンドそのものに対してオプションを与えたい場合を想定していて、その他は普通にDockerfileのCMDコマンドを受け取っているのだな、と理解した。
たったこれだけの話なのに理解するのにものすごい時間を要してしまったので記録として残しておきます。