왜 xargs가 apt-get을 중단 시키는가? 보이지만 apt-get예 또는 아니요를 선택하도록하는

파일에서 패키지 목록을 제거하려고합니다. 다음 명령을 사용하고 있습니다.

cat packages | xargs sudo apt-get remove

packages제거하려는 패키지 목록이 포함 된 파일입니다. 모든 것이 작동하는 것처럼 보이지만 apt-get예 또는 아니요를 선택하도록하는 대신 중단됩니다.

나는 -y옵션 으로이 문제를 해결할 수 있다는 것을 알고 있지만 왜 이런 일이 일어나고 대화 형 선택을 유지할 수 있는지 알고 싶습니다.



답변

xargs -a packages sudo apt-get remove

xargs에서 인수를 읽도록 지시 packages하므로 stdin은 성 가시지 않습니다.


답변

더 일반적인 해결책은

 sudo apt-get remove `cat packages`

패키지 목록 이 너무 길면 문제가 발생합니다 .

그것이 작동하지 않는 이유는 apt-get이 파이프로 인해 표준 입력에서 확인을 읽으려고하기 때문입니다 cat. 반대로, sudo/ dev / tty를 직접 열어서 암호를 물어 보면 올바른 일을합니다. 아파트는 이것을해야하지만 분명히하지 않습니다.


답변

apt-get둘 이상의 패키지를 제거 하기 때문에 조치를 확인해야합니다. STDIN파이프 에서 읽고 터미널에 연결되어 있지 않으므로 auto로 가정합니다 No.

이 문제를 해결하는 또 다른 방법은에 추가 APT::Get::Assume-Yes하는 것 apt.conf입니다.


답변

분명히 xargs는 STDIN을 리디렉션하여 apt-get과 혼동하여 비 대화식 모드로 실행되고 있다고 가정합니다.

아마 같은 것을 사용할 것입니다

sudo apt-get remove $(cat packages)

xargs를 전혀 사용하지 않기 위해.

( “–arg-file”은 apt-get (8) man 또는 나의 활발한 어휘에 없습니다).


답변

해결하기 위해.

GNU xargs 및 ksh / zsh / bash에서 :

sudo xargs -r --arg-file <(cat packages) apt-get remove

명령이 단지의 경우 (물론 cat, 당신은 대체 할 수 <(cat packages)와 함께packages .

또는:

< packages sudo xargs sh -c 'exec apt-get remove "$@" < /dev/tty' sh

“패키지”파일의 형식에 따라 (xargs는 공백으로 구분 된 인수 목록과 따옴표 ( ", '\)를 $(...)처리하지만 따옴표를 처리하지 않고 globbing 패턴을 확장합니다)를 수행 할 수도 있습니다.

sudo apt-get remove $(cat packages)

그러나 많은 운영 체제는 명령 줄 길이에 제한이 있으므로 목록이 크면 작동하지 않을 수 있습니다 ( xargs여러 apt-get명령 을 실행하여 문제를 해결할 수 있음 ).


답변

내가 틀렸을 수도 있지만 시도해보고 작동하는지 확인할 수 있습니다.

yes | sudo apt-get remove $(cat packages)

답변