Próbuję usunąć listę pakietów z pliku. Używam następującego polecenia:
cat packages | xargs sudo apt-get remove
packages
to mój plik zawierający listę pakietów, które chcę usunąć. Wszystko wydaje się działać, ale apt-get
przerywa zamiast pozwolić mi wybrać tak lub nie.
Wiem, że mogę to obejść dzięki tej -y
opcji, ale chciałbym wiedzieć, dlaczego tak się dzieje i jak mogę zachować interaktywny wybór.
sudo xargs --arg-file packages apt-get remove
?Odpowiedzi:
przekieruje
xargs
do odczytu argumentówpackages
, a więc pozostawi stdin niezaprzeczalny.źródło
Bardziej ogólnym rozwiązaniem byłoby
gdzie będziesz mieć problem, jeśli lista pakietów jest naprawdę długa .
Powodem, dla którego nie działa, jest to, że apt-get próbuje odczytać twoje potwierdzenie ze standardowego wejścia, do którego - z powodu potoku - jest przyłączony
cat
. W przeciwieństwie do tego,sudo
robi właściwą rzecz, pytając o hasło, otwierając / dev / tty bezpośrednio. Apt powinien to zrobić, ale najwyraźniej nie.źródło
cat
, ale proces rozpoczęty przez xargs ma standardowe wejście pochodzące z / dev / null. To jest zachowanie xargs. Prosta demonstracja:echo "" | xargs ls -l /dev/self/fd
apt-get
nie powinien się otwierać/dev/tty
. W przeciwnym razie nie można robić takich rzeczyyes | apt-get
. Hasła to/dev/tty
właściwie jedyny przypadek, w którym czytanie z jest właściwą rzeczą, a nawet tyle jest dyskusyjna.--arg-file
opcji przez ephimemient jest jeszcze lepsze w konkretnym przypadku i dlatego głosowałem za nią. W przypadku wielu poleceń, które nie mają takiej opcji, metafora backtick-cat nadal ma swoje zastosowanie.Ponieważ
apt-get
usuwa więcej niż jedną paczkę i dlatego musi potwierdzić akcję. Ponieważ odczytujeSTDIN
z potoku i nie jest podłączony do terminala, automatycznie zakładaNo
.Innym sposobem obejścia tego jest dodanie
APT::Get::Assume-Yes
doapt.conf
.źródło
Najwyraźniej xargs przekierowuje STDIN, co dezorientuje apt-get, zakładając, że działa w trybie nieinteraktywnym.
Prawdopodobnie użyłbym czegoś takiego
aby w ogóle unikać używania xargs.
(„--arg-file” nie jest ani w apt-get (8) man, ani w moim aktywnym słowniku).
źródło
Do obejścia.
Z GNU xargs i ksh / zsh / bash:
(oczywiście, jeśli polecenie jest tylko
cat
, po czym można zastąpić<(cat packages)
zpackages
.Lub:
W zależności od formatu pliku „pakietów” (xargs oczekuje pustej listy argumentów i przetwarza cudzysłowy (
"
,'
i\
), chociaż$(...)
nie przetwarza cudzysłowów i rozwija wzorce globowania), możesz również:Należy jednak pamiętać, że wiele systemów operacyjnych ma ograniczenie długości wiersza polecenia, więc może nie działać, jeśli lista jest duża (podczas gdy
xargs
obejdzie ten problem, uruchamiając kilkaapt-get
poleceń).źródło
Mogę się mylić, ale możesz spróbować i sprawdzić, czy to działa:
źródło