왜 xargs가 apt-get을 중단 시키는가?


17

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

cat packages | xargs sudo apt-get remove

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

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


전혀 작동하지 않는 것처럼 들릴 때 어떻게 "잘 작동"합니까? 파일의 항목은 어떻게 생겼습니까? 시도 했습니까 sudo xargs --arg-file packages apt-get remove?
추후 공지가있을 때까지 일시 중지되었습니다.

apt-get이 올바른 패키지를 제거하는 시점에 도달하기 때문에 일종의 "작동"합니다. --arg-file은 내가 찾던 것입니다. 당신은 대답에 넣을 수 있고 나는 그것을 받아 들일 것입니다. 감사!
subb

답변:


13
xargs -a packages sudo apt-get remove

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


10

더 일반적인 해결책은

 sudo apt-get remove `cat packages`

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

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


xargs의 표준 입력은 cat 되지만 xargs에 의해 시작된 프로세스는 / dev / null에서 표준 입력을 가져옵니다. 이것이 xargs의 동작입니다. 간단한 데모 :echo "" | xargs ls -l /dev/self/fd
Juliano

1
@mws : 아니요, apt-get열면 안됩니다 /dev/tty. 그렇지 않으면 당신은 같은 일을 할 수 없었습니다 yes | apt-get. 암호는 읽는 /dev/tty것이 옳은 유일한 경우 이며, 심지어 그 정도도 논쟁의 여지가 있습니다.
질 'SO- 악마 그만'

의견 주셔서 감사합니다, 나는 slap-dash 응답보다 정확하고 더 나은 생각입니다.
msw

내가 참조. ephemient가 제안한 것처럼 파일 이름과 xargs 사이에 차이점이 있습니까?
subb

네, ephimemient의 --arg-file옵션 사용은 특정 경우에 훨씬 좋습니다. 이러한 옵션이없는 많은 명령의 경우 backtick-cat 은유는 여전히 사용됩니다.
msw

2

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

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


2

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

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

sudo apt-get remove $(cat packages)

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

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


1

해결하기 위해.

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명령 을 실행하여 문제를 해결할 수 있음 ).


0

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

yes | sudo apt-get remove $(cat packages)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.