Shell genera argumentos de comando basados ​​en una lista de cadenas

Shell genera argumentos de comando basados ​​en una lista de cadenas

Recientemente me encontré con el siguiente comando de la ventana acoplable, que es muy largo:

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

¿Hay alguna manera de acortarlo reduciendo la repetición?

Por ejemplo, hay múltiples -vargumentos que podrían expresarse como los siguientes:

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

¿Existe alguna forma compacta de hacer esto en bash o zsh (de forma similar a la expansión del shell, sin escribir otra línea)?

Respuesta1

¿Intentas esto?

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

Respuesta2

Esto debería funcionar en 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

%$1sEsto utiliza la indexación de argumentos POSIX printfpara incluir el mismo parámetro varias veces en la salida (config, local, certs en su ejemplo). Aparentemente bashno es compatible con esto (todavía).

Las continuaciones de línea ( \) son sólo para hacerlo un poco más legible; todavía se puede copiar y pegar con una sola acción.

información relacionada