파일에서 패키지 목록을 제거하려고합니다. 다음 명령을 사용하고 있습니다.
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)