플래그를 xargs에 동적으로 전달

플래그를 xargs에 동적으로 전달

나는 이것을 가지고있다:

r_flag=' -r ';

docker ps -aq  | xargs "$r_flag" docker rm -v | cat;

우분투에서 다음 오류가 발생합니다.

xargs: -r : No such file or directory

왜 그런 겁니까? -r 옵션을 xargs에 전달하고 싶습니다. 내가 그것을 다음과 같이 바꾸면 :

r_flag=' -r ';

도착하다

r_flag='-r';

절뚝거리는...! 그런데 왜.

답변1

r_flag=" -r "변수 값에 공백이 포함되어 있습니다. 즉, 매개변수는 "$r_flag"a xargs로 시작하지 않으므로 -옵션으로 간주되지 않습니다. 옵션의 첫 번째 문자가지다대시가 되십시오.

옵션이 아니기 때문에 xargs실행해야 하는 유틸리티의 이름으로 해석됩니다. 유틸리티를 찾을 수 없고 불평합니다.

올바른 일을 수행하는 다른 방법:

set -- -r
docker ps -aq | xargs "$@" docker rm -v

또는 에서 배열을 사용하십시오 bash.

xargs_opts=( -r )
docker ps -aq | xargs "${xargs_opts[@]}" docker rm -v

xargs이렇게 하면 새 변수를 정의하지 않고도 추가 플래그를 쉽게 전달할 수 있습니다 .

set -- -r -t
docker ps -aq | xargs "$@" docker rm -v

또는 에서 배열을 사용하십시오 bash.

xargs_opts=( -r -t )
docker ps -aq | xargs "${xargs_opts[@]}" docker rm -v

명령에 전달된 배열은 분명히 동적으로 구성될 수 있습니다.

xargs_opts=()

if should_trace; then
    xargs_opts+=( -t )
fi
if should_not_run_on_empty; then
    xargs_opts+=( -r )
fi

관련 정보