명령으로 달러를 탈출하시겠습니까?

명령으로 달러를 탈출하시겠습니까?

부동 도커 이미지를 삭제해야 하는 매우 간단한 쉘 스크립트가 있습니다. 명령은 다음과 같습니다.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

관련 정보