
Недавно я наткнулся на следующую команду 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
Это использует %$1s
индексацию аргументов POSIX printf
для многократного включения одного и того же параметра в вывод (config, local, certs в вашем примере). По-видимому, bash
не поддерживает это (пока).
Продолжения строк ( \
) нужны только для того, чтобы сделать текст более читабельным; его по-прежнему можно скопировать и вставить одним действием.