我有一个运行的程序,会询问用户一些问题。我想自动化它,使得每个问题都被回答为“否”。
yes no | <command>
如果你要回答“no”,则<command>
是你想回答“no”的命令。
(或者如果你只需要输出“n”,则可以使用yes n
)
yes
命令默认情况下会持续输出 y
,以回答每个提示都是“yes”。但你可以传入任意其他字符串作为参数,让它重复回答每个提示。
正如“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
yes | <某些询问是/否的命令>
,yes 命令会停止吗?如果我编写一个包含多个这些命令的 bash shell 脚本,会出现问题吗? - Automaticoyes
命令会在那个命令停止时停止。如果那个命令问了 5 个问题,然后读取了 5 个答案,那么 yes
命令就会打印出 5 行。所以你可以编写一个包含多个这种命令的 bash 脚本,它会按照你的期望工作。 - Brian Campbellecho "no" | command
对于重复操作,制作一个无限循环的while/for循环并不难。
actually, it looks funny ...
$ 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.
...
/etc
中的ttys
文件是其中最著名的之一(它的发音类似于“titties”,意为“乳房”)。 - just somebody如果您对某些可移植性感兴趣的话,需要注意:yes(1)在单一Unix规范(又名POSIX)中没有描述,因此是非标准化的。 但无论如何它仍然很容易移植(请参阅HISTORY段落; 遗憾的是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*/
}
yes
的回答太快了,你可以通过使用修改过的@Brian Campbell的答案来稍微减缓速度——这样做可以在每个“no”的重复之间增加0.1秒的延迟。while true; do echo no; sleep 0.1s; done | <command here>