调用.sh文件后如何将数据发送到命令行?

时间:2015-06-04 15:20:56

标签: sh

我想通过EasyBuild安装Anaconda。 EasyBuild是一个管理集群上软件安装的软件。 Anaconda可以与sh Anaconda.sh一起安装。 但是,运行后,我必须接受许可协议,并通过输入<Enter>yes <Enter>path/where/to/install/ <Enter>在命令行中提供安装位置。

因为必须自动安装,我想接受术语并将安装位置放在一行。我试着这样做:

sh Anaconda.sh  < <(echo) >/dev/null < <(echo yes) >/dev/null \
    < <(echo /apps/software/Anaconda/1.8.0-Linux-x86_64/) > test.txt

从test.txt我可以看到第一个echo工作为<Enter>,但我无法弄清楚如何接受许可协议,因为它现在认为它不发送是:

Do you approve the license terms? [yes|no]
[no] >>> The license agreement wasn't approved, aborting installation.

如何正确地将yes发送到脚本输入?

2 个答案:

答案 0 :(得分:2)

编辑:对不起,我错过了关于不得不输入一件事的部分。您可以看一下编写expect脚本。 thegeekstuff.com/2010/10/expect-examples。但是,您可能需要安装它。

您可以尝试使用以下命令进行管道传输:yes yes | sh Anaconda.sh。阅读手册页以获取更多信息man yes

答案 1 :(得分:2)

期待是一个很好的方式,可能是最容易出错的方式。如果您知道所有问题,我认为您可以通过以正确的顺序编写一个包含答案的文件来实现这一点,每行一个并将其输入。

这个安装脚本非常庞大,只要你能够验证你知道所有问题就可以试试。

在我的简单测试中它起作用。

我有一个看起来像这样的测试脚本:

#!/bin/sh 
echo -n "Do you accept " 
read ANS 
echo $ANS 
echo -n "Install path: " 
read ANS
echo $ANS 

和一个如下所示的答案文件:

Y
/usr

像这样运行它...也许它也适用于你的怪物安装文件。

cat answers | ./test.sh 
Do you accept Y
Install path: /usr

如果这不起作用,则脚本可能会刷新,您将不得不使用expect或pexpect。

祝你好运!

实际上,我下载并查看了anaconda安装脚本。看起来它需要命令行参数。

/bin/bash Anaconda-2.2.0-Linux-x86_64.sh -h 
usage: Anaconda-2.2.0-Linux-x86_64.sh [options]

Installs Anaconda 2.2.0

-b           run install in batch mode (without manual intervention),
             it is expected the license terms are agreed upon
-f           no error if install prefix already exists
-h           print this help message and exit
-p PREFIX    install prefix, defaults to /home/cody.stevens/anaconda

使用-b和-p选项... 所以像这样使用它:

/bin/bash Anaconda-2.2.0-Linux-x86_64.sh -b -p /usr

同样值得注意的是......该脚本明确表示不会使用&#39;。&#39;或者&#39; sh&#39;但是&#39; bash&#39;所以他们必须依赖于bash的一个特性。

- 科迪