如何使用bash脚本始终对任何提示回答“否”?

时间:2009-12-25 23:22:20

标签: bash

我有一个程序可以运行并询问用户某些问题。我想自动化它,以便每个问题都以No。

回复

5 个答案:

答案 0 :(得分:27)

yes no | <command>

<command>是您要回答no的命令。

(或yes n,如果您确实需要输出n

默认情况下,yes command会输出y的连续流,以便对每个提示回答“是”。但是你可以传入任何其他字符串作为参数,以便它重复每个提示符。

作为pointed out by "just somebody"yes实际上并未标准化。虽然它可以在我曾经使用的每个系统上使用(各种BSD,Mac OS X,Linux,Solaris,Cygwin),如果你以某种方式设法找到它没有的系统,以下应该可以工作:

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

或者作为yes的完整shell脚本实现,您可以使用以下内容:

#!/bin/sh

if [ $# -ge 1 ]
then
    while true; do echo "$1"; done
else
    while true; do echo y; done
fi

答案 1 :(得分:5)

实际上,它看起来很有趣......

$ yes no

联机帮助页摘录:

$ 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.

...

答案 2 :(得分:3)

对于没有这种命令的系统,只需要一个简单的回声

echo "no" | command

重复,而不是那么难以制作一段时间/ for循环。

答案 3 :(得分:1)

以防您可能对某些可移植性感兴趣:是(1)是非标准,因为它没有在单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*/
}

答案 4 :(得分:0)

如果您发现yes由于某种原因回答得太快,则可以使用@Brian Campbell回答的修改版来稍微减慢速度-每次重新填表之间会延迟0.1秒“否”一词

while true; do echo no; sleep 0.1s; done | <command here>