부동 도커 이미지를 삭제해야 하는 매우 간단한 쉘 스크립트가 있습니다. 명령은 다음과 같습니다.docker rmi $(docker images -f "dangling=true" -q)
이제 나는 원인이라고 생각되는 문제에 직면했습니다 $
. 하지만 내가 틀렸을 수도 있습니다.
내 스크립트는 다음과 같습니다
#!/bin/bash
cd /Users/jared/Projects
for d in ./*/ ;
do (cd "$d" && docker rmi $(docker images -f "dangling=true" -q); true); done
실행하면 화면에 다음과 같이 인쇄됩니다.
"docker rmi"에는 인수가 1개 이상 필요합니다.
"docker rmi --help"를 참조하세요.
사용법: docker rmi [옵션] IMAGE [IMAGE...]
하나 이상의 이미지 삭제
내가 내린 가정은 이 $(docker imag...)
캐릭터가 당연히 $
특수 캐릭터이기 때문이다.
어떻게 탈출하거나 적어도 내 스크립트가 원하는 방식으로 작동하도록 할 수 있습니까?
답변1
오퍼레이터 $(...)
라고 합니다명령 대체, 후행 줄 바꿈이 제거된 명령의 표준 출력으로 확장된 출력입니다.
따옴표가 없고 목록 컨텍스트에서는 분할+glob(나뉘다) 에서만 가능합니다 zsh
.
예를 들어, cmd
출력 *:x\n\n
에 가 $IFS
포함된 :
경우 및 목록 컨텍스트에서는 및 로 분할되어 현재 $(cmd)
디렉터리 의 파일 목록으로 확장 됩니다 .*:x
*
x
*
그래서 일반적으로:
cmd1 $(cmd2)
$IFS
(공백, 탭 및 개행) 의 기본값은 의 cmd1
(공백/탭/개행 구분) 패턴 목록과 일치하는 파일 목록 에 전달됨을 의미합니다 cmd2
.
여기에 오류 메시지 출력을 제공하십시오.cmd1
, 당신 것 같아요cmd2
아무것도 출력하지 않거나 공백, 탭, 개행만 출력합니다. 그러면 인수가 에 전달되지 않습니다 cmd1
.
따라서 이 특별한 경우를 먼저 처리해야 할 수도 있습니다. 예를 들면 다음과 같습니다.
set -- $(docker images -f dangling=true -q)
[ "$#" -eq 0 ] || docker rmi "$@"
또는 GNU 또는 FreeBSD를 사용하여 xargs
다음을 수행합니다.
docker images -f dangling=true -q |
xargs -r docker rmi
이는 또한 출력 단어가 docker images
파일 패턴으로 처리되는 것을 방지합니다. xargs
명령에 인수로 전달되는 공백 + 개행으로 구분된 단어 목록을 사용하며 일부 형식의 인용도 이해합니다. 각 입력 줄에 대해 매개 변수를 전달하려면 다음을 사용할 수 있습니다(GNU 사용 xargs
).
docker images -f dangling=true -q |
xargs -rd '\n' docker rmi