Почему xargs вызывает склонный - добираются для прерывания?

Это специализировано. Например, приложение Установок системы действительно выходит при нажатии на красную кнопку. Однако большинство программ только закрывает окно (и документы в), когда Вы пытаетесь "закрыть" его. Я предполагаю, что идея позади этого состоит в том, чтобы сделать вещи быстрее, когда Вы хотите использовать приложение снова.

Если я хочу закрыться, я хочу закрыться. Период.

Я соглашаюсь, таким образом, я использую сочетания клавиш, Cmd+w для того, чтобы закрыть окно и Cmd+q для того, чтобы действительно выйти. Большинству приложений реализовали это. Альтернатива должна щелкнуть правой кнопкой по значку приложения и выбрать "Quit", который намного медленнее.

17
05.10.2012, 21:04
6 ответов
xargs -a packages sudo apt-get remove

направит xargs считать аргументы от packages, и таким образом, это оставит stdin в безопасности.

13
27.01.2020, 19:47

Более общее решение было бы

 sudo apt-get remove `cat packages`

где у Вас будет проблема, если список пакетов будет действительно длинен.

Причина, что это не работает, настолько склонна - добираются, пытается считать Ваше подтверждение из стандартного входа, который - из-за канала - присоединен cat. Наоборот, sudo делает Правильную Вещь путем выяснения у пароля путем открытия/dev/tty непосредственно. Кв. должна сделать это, но по-видимому не делает.

10
27.01.2020, 19:47
  • 1
    Стандартный вход xargs подключен к каналу от cat, но процесс, запущенный xargs, имеет свой стандартный вход, прибывающий из/dev/null. Это - поведение xargs. Простая демонстрация: echo "" | xargs ls -l /dev/self/fd –  Juliano 15.11.2010, 17:10
  • 2
    @mws: Нет, apt-get не должен открываться /dev/tty. Иначе Вы не могли сделать вещей как yes | apt-get. Пароли являются в значительной степени единственным случаем где чтение из /dev/tty правильная вещь, и даже так много спорно. –  Gilles 'SO- stop being evil' 15.11.2010, 22:21
  • 3
    Спасибо за комментарии оба - корректная и лучшая мысль, чем мой небрежный ответ, который я собираюсь оставить неотредактированным так, чтобы комментарии все еще имели смысл. –  msw 16.11.2010, 06:14
  • 4
    я вижу. Есть ли какое-либо различие между этим, и xargs-a имя файла, как ephemient предлагает? –  subb 17.11.2010, 08:23
  • 5
    Да, использование ephimemient --arg-file вариант еще лучше для конкретного случая, который является почему я upvoted он. Для многих команд, которые не имеют такой опции, метафора кошки обратной галочки все еще имеет свое использование. –  msw 17.11.2010, 16:09

Поскольку apt-get удаляет больше чем один пакет и поэтому должен подтвердить действие. Так как это читает STDIN от канала и не подключен к терминалу, который он автоматический принимает No.

Другой способ обойти это состоит в том, чтобы добавить APT::Get::Assume-Yes кому: apt.conf.

2
27.01.2020, 19:47

По-видимому, xargs перенаправляет STDIN, который путает склонный - добираются, чтобы предположить, что он работает в неинтерактивном режиме.

Я, вероятно, использовал бы что-то как

sudo apt-get remove $(cat packages)

избегать использования xargs вообще.

(" - файл аргумента" ни в Кв. - добираются (8) человек, ни в моем активном словаре).

2
27.01.2020, 19:47

Работать вокруг.

С 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 команды).

1
27.01.2020, 19:47

Я могу быть неправым, но можно попробовать это и видеть, работает ли это:

yes | sudo apt-get remove $(cat packages)
0
27.01.2020, 19:47

Теги

Похожие вопросы