Как мне всегда отвечать «нет» на любой запрос с помощью bash-скрипта? - PullRequest
13 голосов
/ 26 декабря 2009

У меня есть программа, которая запускает и задает пользователям определенные вопросы. Я хочу автоматизировать это так, чтобы на каждый вопрос отвечали с номером

Ответы [ 5 ]

29 голосов
/ 26 декабря 2009
yes no | <command>

Где <command> - команда, на которую вы хотите ответить no.

(или yes n, если вам действительно нужно просто вывести n)

Команда 1011 * по умолчанию выводит непрерывный поток y, чтобы ответить «да» на каждый запрос. Но вы можете передать любую другую строку в качестве аргумента, чтобы повторить это в каждом приглашении.

Как указал "просто кто-то" , yes на самом деле не стандартизировано. Хотя он доступен в каждой системе, которую я когда-либо использовал (различные BSD, Mac OS X, Linux, Solaris, Cygwin), если вам как-то удастся найти такую, в которой он не работает, должно работать следующее:

while true; do echo no; done | <command>

Или как полноценную реализацию сценария оболочки yes, вы можете использовать следующее:

#!/bin/sh

if [ $# -ge 1 ]
then
    while true; do echo "$1"; done
else
    while true; do echo y; done
fi
5 голосов
/ 26 декабря 2009

на самом деле, это выглядит смешно ...

$ yes no

выдержка из manpages:

$ man yes 

YES(1)                    BSD General Commands Manual                   YES(1)

NAME
     yes -- be repetitively affirmative

SYNOPSIS
     yes [expletive]

DESCRIPTION
     yes outputs expletive, or, by default, ``y'', forever.

...
3 голосов
/ 26 декабря 2009

для систем без такой команды, просто эхо должно работать

echo "no" | command

для повторений, не так сложно создать цикл while / for, который будет продолжаться вечно.

1 голос
/ 26 декабря 2009

на тот случай, если вас может заинтересовать некоторая переносимость: да (1) - это нестандартный в том смысле, что он не описан в спецификации Single Unix (POSIX под другим именем). но в любом случае он довольно переносим (см. параграф ИСТОРИЯ; к сожалению, MYYN не процитировал все это):

YES(1)                  FreeBSD General Commands Manual                 YES(1)

NAME
     yes — be repetitively affirmative

SYNOPSIS
     yes [expletive]

DESCRIPTION
     The yes utility outputs expletive, or, by default, “y”, forever.

HISTORY
     The yes command appeared in Version 32V AT&T UNIX.

FreeBSD 9.0                      June 6, 1993                      FreeBSD 9.0

редактировать

в случае, если вы попали в нечетную систему, которая не реализует эту команду, просто предоставить ее самостоятельно. это из FreeBSD-9:

int
main(int argc, char **argv)
{
 if (argc > 1)
  while (puts(argv[1]) != EOF)
   ;
 else
  while (puts("y") != EOF)
   ;
 err(1, "stdout");
 /*NOTREACHED*/
}
0 голосов
/ 30 мая 2019

Если вы обнаружите, что yes отвечает по какой-то причине слишком быстро, вы можете немного затормозить, используя модифицированную версию ответа @Brian Campbell - это добавляет задержку в 0,1 секунды между каждым повторением слово "нет"

while true; do echo no; sleep 0.1s; done | <command here> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...