다음을 사용하여 설치하려는 패키지의 이름을 반환하는 파이프를 설정했습니다 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
두 가지 모두 성공 여부에 관계없이 실행됩니다. 왜냐하면 및가 동시에 시작되고 동시에 실행되기 때문입니다.sudo
cmd
sudo
cmd