xargs로 인해 apt-get이 중단되는 이유는 무엇입니까?

xargs로 인해 apt-get이 중단되는 이유는 무엇입니까?

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

cat packages | xargs sudo apt-get remove

packages내 파일에는 제거하려는 패키지 목록이 포함되어 있습니다. 모든 것이 작동하는 것 같지만 apt-get예 또는 아니요를 선택할 수 있는 대신 중단됩니다.

해당 옵션을 사용하여 이 문제를 해결할 수 있다는 것을 알고 있지만 -y이러한 문제가 발생하는 이유와 대화형 선택을 유지하는 방법을 알고 싶습니다.

답변1

xargs -a packages sudo apt-get remove

xargs인수는 에서 직접 읽혀지므로 packagesstdin은 그대로 유지됩니다.

답변2

보다 일반적인 해결책은

 sudo apt-get remove `cat packages`

목록이 다음과 같은 경우 문제가 발생합니다.패키지가 정말 길어요.

작동하지 않는 이유는 apt-get이 (파이프로 인해) 표준 입력에서 확인을 읽으려고 하기 때문입니다 cat. 대신 sudo/dev/tty를 직접 열고 비밀번호를 묻는 것이 올바른 것입니다. 할 것. Apt는 이 작업을 수행해야 하지만 분명히 그렇지 않습니다.

답변3

apt-get여러 패키지가 제거되므로 작업을 확인해야 합니다 . STDIN파이프에서 읽고 터미널에 연결되지 않았기 때문에 자동으로 가정됩니다 No.

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

답변4

해결책.

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는 공백으로 구분된 인수 목록을 예상하고 따옴표(및 ")를 처리하지만 따옴표를 처리하지 않고 와일드카드 패턴을 확장함) 다음을 수행할 수도 있습니다.'\$(...)

sudo apt-get remove $(cat packages)

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

관련 정보