입력이 제공되지 않으면 xargs가 유틸리티를 실행하지 못하게 하십시오.

입력이 제공되지 않으면 xargs가 유틸리티를 실행하지 못하게 하십시오.

나는 다음 명령을 가지고 있습니다 :

docker volume ls -qf dangling=true | xargs docker volume rm

알겠어요:

"docker volume rm" requires at least 1 argument.
See 'docker volume rm --help'.

Usage:  docker volume rm [OPTIONS] VOLUME [VOLUME...]

입력이 없기 때문이라고 생각합니다 xargs(명령이 일치하는 볼륨을 반환하지 않기 때문에 docker). 나는 무엇을 해야 합니까 xargs?아무것도 없다입력이 수신되지 않을 때?

답변1

당신은 이 옵션을 찾고 있습니다 -r. 이는 비표준 옵션이며 시스템에 구현될 수 있습니다(설명서 확인 xargs).

GNU xargs매뉴얼에서:

-r,--no-run-if-empty

표준 입력에 공백이 아닌 항목이 없으면 명령을 실행하지 마십시오. 일반적으로 명령은 입력이 없더라도 한 번만 실행됩니다. 이 옵션은 GNU 확장입니다.

OpenBSD 시스템 매뉴얼에서:

-r

매개변수 없이 이 명령을 실행하지 마십시오. 일반적으로 명령은 인수 없이도 한 번 이상 실행됩니다.

FreeBSD 및 macOS에서는 이것이 기본 동작입니다. FreeBSD에는 -r선택적 GNU 호환성이 있지만 xargsmacOS에는 없습니다.

xargsAIX 및 Solaris에는 옵션이 없으며 -rAIX의 기본 동작이 무엇인지 모르겠습니다(AIX 시스템에 액세스할 수 없습니다). 기본적으로 Solaris는 이 유틸리티를 최소한 한 번 실행합니다.


-r플래그가 없는 시스템 xargs(그리고 유틸리티를 한 번 실행하는 것이 Solaris와 같이 동양에서는 기본 동작임)에 대한 이식 가능한 해결 방법은 다음을 사용하는 것입니다.

something | xargs sh -c '[ "$#" -gt 0 ] && utility "$@"' sh

(또는 이와 유사한 것, 후행이 sh필요하다는 점에 유의하십시오) utility실행하려는 유틸리티는 어디에 있고 몇 가지 인수를 생성하는 xargs곳은 어디입니까 ?something

짧은 쉘 스크립트는 [ "$#" -gt 0 ] && utility "$@"인수가 제공되는지 여부를 테스트하고, 제공된 경우 해당 인수를 사용하여 유틸리티를 실행합니다.

관련 정보