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

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에는 -rGNU와의 호환성 옵션이 있지만 xargsmacOS에는 없습니다.

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


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

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

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

짧은 쉘 스크립트는 [ "$#" -gt 0 ] && utility "$@"인수가 주어졌는지 여부를 테스트하고, 그렇다면 해당 인수를 사용하여 유틸리티를 실행합니다.

관련 정보