シェルは文字列のリストに基づいてコマンド引数を生成します

シェルは文字列のリストに基づいてコマンド引数を生成します

最近、非常に長いdockerコマンドに遭遇しました。

docker run -it -v $PWD/config:/opt/ibm/datapower/drouter/config -v $PWD/local:/opt/ibm/datapower/drouter/local -v $PWD/certs:/opt/ibm/datapower/root/secure/certs -e DATAPOWER_ACCEPT_LICENSE=true -e DATAPOWER_INTERACTIVE=true -p 9090:9090 -p 9022:22 -p 5554:5554 -p 8000-8010:8000-8010 --name idg ibmcom/datapower

繰り返しを減らして短くする方法はありますか?

例えば、-v次のように表現できる複数の引数があります。

for each string in ['config', 'local', 'certs']:
    -v $PWD/$$string:/opt/ibm/datapower/drouter/$$string

これを bash または zsh で実行するためのコンパクトな方法はありますか (別の行を記述せずに、シェルの拡張に似た方法で)?

答え1

これを試してみませんか:

docker run -it $(for d in config local certs; do echo -n "-v $PWD/$d:/opt/ibm/datapower/drouter/$d "; done) -e DATAPOWER_ACCEPT_LICENSE=true -e DATAPOWER_INTERACTIVE=true -p 9090:9090 -p 9022:22 -p 5554:5554 -p 8000-8010:8000-8010 --name idg ibmcom/datapower

答え2

これは以下で動作するはずですzsh:

docker run -it \
  $(printf -- "-v $PWD/%1\$s:/opt/ibm/datapower/drouter/%1\$s " config local certs)\
  -e DATAPOWER_ACCEPT_LICENSE=true -e DATAPOWER_INTERACTIVE=true \
  -p 9090:9090 -p 9022:22 -p 5554:5554  -p 8000-8010:8000-8010 \
  --name idg ibmcom/datapower

これは、POSIX%$1s引数インデックスを使用してprintf、出力に同じパラメータを複数回含めます (例では、config、local、certs)。どうやらbashこれはサポートされていないようです (まだ)。

行継続 ( \) は、読みやすくするためのものであり、1 回の操作でコピーして貼り付けることができます。

関連情報