쉘은 문자열 목록을 기반으로 명령 인수를 생성합니다.

쉘은 문자열 목록을 기반으로 명령 인수를 생성합니다.

나는 최근에 너무 긴 다음 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이것을 (아직) 지원하지 않습니다.

연속된 줄( \)은 단지 좀 더 읽기 쉽게 하기 위한 것입니다. 단일 작업으로 계속 복사하여 붙여넣을 수 있습니다.

관련 정보