사용자 입력이 필요한 명령과 함께 xargs를 사용하는 방법은 무엇입니까?

사용자 입력이 필요한 명령과 함께 xargs를 사용하는 방법은 무엇입니까?

다음을 사용하여 설치하려는 패키지의 이름을 반환하는 파이프를 설정했습니다 apt-get.

... | xargs -I _ sudo apt install _

그러나 apt-get이 경우 표준 입력에서 읽고 종료할 수 있는 방법이 없습니다.

계속하시겠습니까? [Y/N] 중단합니다.

사용자 확인 없이 패키지를 설치하라는 플래그가 있다는 것을 알고 있지만 -y실제로 확인을 보고 싶습니다.

apt-get표준 입력에서 읽을 수 있도록 허용하면서 패키지 이름을 으로 전달하는 방법이 있습니까 ?

apt-get전체 명령의 왼쪽에 배치하는 것은 옵션이 아닙니다 apt-get. 해당 옵션이 파이프라인에서 이전 명령을 중단하는 데 사용되는 경우 명령을 실행하고 싶지 않기 때문입니다 set -o pipefail.

답변1

pipefail파이프라인의 오른쪽은 실행이 차단되지 않으며 전체 파이프라인은 평소와 같이 동시에 실행됩니다. 예를 들어 시도해보십시오.

$ set -o pipefail
$ false | echo foo
foo

입력이 없으면 사용이 xargs여기에서 실행되는 것을 방지할 수도 있고 그렇지 않을 수도 있습니다. apt그렇지 않은 경우에도 -r최소한 -I한 번은 명령을 실행합니다.

apt그러나 명령 대체를 사용하여 출력을 캡처한 다음 결과에 따라 실행하거나 실행하지 않음으로써 이 문제를 해결할 수 있습니다 .

if packages=$(somecmd...) && [ "$packages" ] ; then
    set -f
    sudo apt install $packages
fi

패키지 이름에는 공백이 포함되어서는 안 되므로 $packages따옴표 없이 사용하면 작동합니다(기본값을 가정 $IFS하면 전역 문자도 포함할 수 없으므로 set -f불필요할 수 있습니다).

답변2

GNU 구현 xargs(일반적으로 apt명령도 있는 시스템에서 발견됨)과 프로세스 대체를 지원하는 ksh93/zsh/bash와 같은 셸을 사용하면 다음을 수행할 수 있습니다.

sudo xargs -I _ -ra <(cmd) apt install _

바꾸다:

cmd | xargs -I _ sudo apt install _

패키지당 하나의 패키지를 호출하는 apt것보다 모든 패키지를 한 번에 전달하는 것이 더 합리적일 수 있습니다 .apt

sudo xargs -d '\n' -ra <(cmd) apt install

( -d또 다른 GNU 확장입니다)

어떤 경우든 파이프라인 버전과 마찬가지로 pipefail두 가지 모두 성공 여부에 관계없이 실행됩니다. 왜냐하면 및가 동시에 시작되고 동시에 실행되기 때문입니다.sudocmdsudocmd

관련 정보