Bash shell参数传递......?

时间:2014-05-26 08:50:45

标签: linux bash

您可以在bash shell中使用分号来指定多个命令。 有时,其中一个命令弹出一个问题,需要用户输入。 (通常' y' /' n'或者其他什么) 如果我事先知道我想要回答什么,有没有办法以某种方式将它解析为命令,比如参数,或者一些奇怪的魔法管道东西?

5 个答案:

答案 0 :(得分:2)

你不需要任何奇怪的魔法管道东西,而只需要一根烟斗。

./foo ; echo "y" | ./bar ; ./baz
如果您愿意,可以使用

或神奇的herestring语法:

./foo ; ./bar <<<"y" ; ./baz

答案 1 :(得分:2)

您可以使用yes命令将大量“y”放入管道。

例如,如果要删除所有文本文件,可以使用

yes | rm -r *.txt

导致rm提出的每个问题都被y回答。 如果您想要另一个默认答案,可以将其作为参数提供给是:

yes n | rm -r *.txt

这将输出'n'。

有关详细信息,请参阅http://en.wikipedia.org/wiki/Yes_(Unix)

答案 2 :(得分:2)

对于简单的&#34;是&#34;回答有一个命令yes,可在大多数Unix和Linux平台上使用:

$ yes | /bin/rm -i *

对于高级协议,您可能需要检查着名的Expect,也可以广泛使用。它需要Tcl的基本知识。

答案 3 :(得分:2)

首先,这不是bash弹出这些问题。它是被调用的特定程序(例如,cp -i在覆盖文件之前询问)。通常这些命​​令也有开关来回答问题,例如-y用于fsck,或-f如何覆盖-i in rm。许多程序可以通过管道来回答,这就是我们命令“是”的原因,但有些程序需要额外的长度以确保它们不能;例如,在询问密码时使用ssh。管道也没什么神奇之处。如果程序有时只提出一个问题,并且问题是什么问题,那么有一些专门为此设计的工具,例如“expect”。

在典型的shell脚本中,当您确切知道要输入的内容并且程序接受stdin上的输入时,您可以使用普通管道来处理它:

echo -e '2+2\n5*3' | bc

如果它是一个较长的部分,那么这里的文档可能会有所帮助:

bc <<EOF
2+2
3*5
EOF

答案 4 :(得分:1)

有时,命令会提供设置问题默认答案的选项。一个值得注意的例子是apt-get - Debian / Ubuntu / Mint的包管理器。它提供了在非交互式脚本中使用的选项-y--yes--assume-yes