Shell генерирует аргументы команды на основе списка строк

Shell генерирует аргументы команды на основе списка строк

Недавно я наткнулся на следующую команду 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не поддерживает это (пока).

Продолжения строк ( \) нужны только для того, чтобы сделать текст более читабельным; его по-прежнему можно скопировать и вставить одним действием.

Связанный контент