Давайте проанализируем вашу команду:
yes n | (ls | xargs -n1 -p rm)
Конвейер ls | xargs -n1 -p rm
имеет ls
, читающий стандартный ввод, но имеет стандартный вывод, перенаправленный на xargs
, который принимает его как стандартный ввод, а стандартный вывод не изменяется.
Теперь вы отправляете вывод yes
в этот конвейер. Поскольку стандартный ввод этого конвейера идет в ls
, который даже не читает его, xargs
не видит ничего из этого.
Теперь очевиден вопрос: как xargs
может спросить вас, выполнять ли команду? В конце концов, его стандартный ввод (где программы обычно читают действия пользователя) перенаправлен на чтение вывода ls
!
Ответ заключается в том, что xargs
обходит механизм перенаправления для этих вопросов, просто открывая файл терминала / dev / tty
напрямую. Поэтому перенаправление файлов не влияет на ввод подтверждения.
Для ввода в xargs
вам понадобится программа, которая может представить процесс с помощью терминального устройства, управляемого программой. Очень мощной (но и довольно сложной) такой программой является expect
. К сожалению, я не знаю более простого способа добиться желаемого.