如何从文本文件向交互式Bash脚本输入数据

5
我有一个脚本(来自供应商,用于掩盖密码),它通过一系列用户输入并根据输入生成一些输出。我想能够包装另一个脚本,从文本文件中提取输入,然后捕获输出以便日后使用。有人有这方面的示例吗?
更新:我进行了一些调查,发现shell脚本启动了一个Java进程,这就是请求用户输入的原因。对于此情况,xargs、<、>、|似乎无法正常工作。

2
没有足够的内容来回答你的问题,但请查看 expect(http://expect.sourceforge.net/)网站。 - Sean Bright
3
你尝试过普通的I/O重定向吗?根据脚本读取输入的方式,有时这种方法可以奏效。 - David Z
3个回答

6

myscript < input_file > output_file (通过命令行)将逐行读取input_file的内容,就像它是用户输入一样,然后将输出写入到output_file中。但要注意,如果output_file已经存在,它将会被完全覆盖而没有任何警告。


1
“<”,“>”和“|”都是很好的工具。 “script1 | script2”将把“script1”的输出作为输入传递给“script2”。 - Lorkenpeist
">>" 是另一个有用的工具。"myscript >> output_file" 将把 "myscript" 的输出追加到 "output_file" 的末尾。 - Lorkenpeist
感谢您的回复。请参见上面的更新。实际上,这是由一个shell脚本启动的Java进程。到目前为止,这些建议都没有成功。 - etsauer

5

您可以尝试使用“expect”程序,它作为大多数Linux发行版的软件包可用。它使用简单的脚本语言来提供交互式程序。一个示例脚本可以像这样:

#!/usr/bin/expect
spawn passwordmanager
expect "Enter password for testuser:"
send "verysecret123"

这个脚本会告诉expect启动程序passwordmanager,然后等待提示符Enter password for testuser:,并用verysecret123来回答它,以此类推。


-1

你觉得使用一个 shell 函数怎么样?

function script_plus ()
{
   if [ $# != 2 ]; then echo "usage: ..."; exit; fi
   src=$1;
   tgt=$2;
   if [ ! -f $src ]; then echo "usage: ..."; exit; fi
   cat $src | xargs script > $tgt
}

假设“script”是您的供应商脚本。不进行错误检查(仅用于说明)。如果不是shell函数,则上述“script_plus”的主体可以是shell脚本文件的内容。

1
你有一些代码问题——例如,你需要"$src"而不是src——但更根本的是,我不认为 script_plus FOO BARscript < FOO > BAR 更好,我也不认为这种方法值得推荐。 - ruakh
谢谢,使用xargs修复了。当需要用错误/参数检查来增强脚本时,“值得推荐”的内容会发生变化。例如,输入存在。 - GoZoner
xargs 绝对不是 OP 需要的。现有脚本不会将这些内容作为命令行参数;相反,它“遍历一系列用户输入”。 - ruakh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接