Я пытаюсь удалить список пакетов из файла. Я использую следующую команду:
cat packages | xargs sudo apt-get remove
packages
мой файл, содержащий список пакетов, которые я хочу удалить. Кажется, все работает, но apt-get
прерывается, вместо того, чтобы позволить мне выбрать да или нет.
Я знаю, что могу обойти это с -y
опцией, но я хотел бы знать, почему это происходит и как я могу сохранить интерактивный выбор.
sudo xargs --arg-file packages apt-get remove
?Ответы:
будет направлен
xargs
на чтение аргументовpackages
, поэтому он не будет подвергаться насилию.источник
Более общее решение будет
где у вас будет проблема, если список пакетов очень длинный .
Причина, по которой он не работает, состоит в том, что apt-get пытается прочитать ваше подтверждение из стандартного ввода, к которому - из-за канала - прикреплено
cat
. Наоборот,sudo
поступает правильно, спрашивая свой пароль, открывая / dev / tty напрямую. Апт должен сделать это, но, очевидно, нет.источник
cat
, но процесс, запущенный xargs, имеет стандартный ввод из / dev / null. Это поведение xargs. Простая демонстрация:echo "" | xargs ls -l /dev/self/fd
apt-get
не должен открываться/dev/tty
. В противном случае вы не можете делать такие вещи, какyes | apt-get
. Пароли в значительной степени единственный случай , когда чтение из/dev/tty
является правильным, и даже , что многое спорно.--arg-file
опции ephimemient еще лучше для конкретного случая, поэтому я проголосовал за него. Для многих команд, у которых нет такой опции, метафора backtick-cat все еще имеет свое применение.Потому
apt-get
что удаляет более одного пакета, и, следовательно, должны подтвердить действие. Так как он читаетSTDIN
из канала и не подключен к терминалу, он принимает автоматическиNo
.Другой способ обойти это , чтобы добавить
APT::Get::Assume-Yes
кapt.conf
.источник
По-видимому, xargs перенаправляет STDIN, что сбивает с толку apt-get, предполагая, что он работает в неинтерактивном режиме.
Я бы, наверное, использовал что-то вроде
чтобы вообще не использовать xargs.
(«--arg-file» отсутствует ни в apt-get (8) man, ни в моем активном словаре).
источник
Чтобы обойти.
С GNU xargs и ksh / zsh / bash:
(конечно, если команда просто
cat
, то вы можете заменить<(cat packages)
наpackages
.Или:
В зависимости от формата файла «packages» (xargs ожидает разделенный пробелами список аргументов и обрабатывает кавычки (
"
,'
и\
), в то время$(...)
как не обрабатывает кавычки и расширяет шаблоны глобирования), вы также можете сделать:Но обратите внимание, что многие операционные системы имеют ограничение на длину командной строки, поэтому оно может не работать, если список большой (хотя можно
xargs
обойти проблему, выполнив несколькоapt-get
команд).источник
Я могу ошибаться, но вы можете попробовать это и посмотреть, работает ли это:
источник