echo "yes" | my_program < input_file
Ambiguous input redirect
我在 csh 中遇到错误。怎么解决这个问题呢?
答案1
根据 op 留下的评论,my_program
有时需要对问题做出答复yes|no
。
这意味着操作人员想要使用expect
正确的工具来完成任务;从期望的手册页:
Expect 是一个根据脚本与其他交互式程序“对话”的程序。按照脚本,Expect 知道程序可以期待什么以及正确的响应应该是什么。解释性语言提供分支和高级控制结构来指导对话。此外,用户可以在需要时直接进行控制和交互,然后将控制权返回给脚本。
现在,我不知道操作程序的程序发出的提示是什么,但是,假设它以Are you sure
以下内容开头应该可以工作:
#!/usr/bin/expect
spawn bash -c "my_program < /tmp/input"
expect {
"Are you sure" {
send "yes"
}
eof
}
您只需使用上述内容创建一个 shell 脚本并执行它,而不是执行您想要执行的命令。
更通用的期望脚本,需要四个参数:“程序”,“输入文件”,“问题”,“您的答复”(其中后两个是可选的,如果“问题”没有出现,则不会发送“答复”并且该脚本将成功退出):
#!/usr/bin/expect
set arg1 [lindex $argv 0]
set arg2 [lindex $argv 1]
set arg3 [lindex $argv 2]
set arg4 [lindex $argv 3]
spawn bash -c "$arg1 < $arg2"
expect {
"$arg3" {
send "$arg4"
}
eof
}
使用如下(假设您将以上内容复制到 中myexp.sh
):
./myexp.sh "my_program" "/tmp/input" "yes"
一般来说,如果您需要多个输入源,您可以使用此处文档对它们进行排序。
my_program <<EOF
`cat input_file`
yes
EOF
多输入的另一种选择:
echo 'yes' >> input_file
或使用临时文件:
echo 'yes' > /tmp/myfile$$.txt
cat input_file >> /tmp/myfile$$.txt
my_program < /tmp/myfile$$.txt
这完全取决于您想要实现的目标。
编辑(来自评论):
( echo 'yes'; cat input_file;) | my_program
也有效......我找到heredocs更轻松阅读,YMMV。
答案2
问题是您正在将标准输出echo
通过管道传输到my_program
...的标准输入
echo "yes" | my_program
...而同时你还将的内容输入input_file
到 的标准输入my_program
:
my_program < input_file
进程(在本例中my_program
)无法从两个不同的源获取 stdin,因此您需要选择必须提供输入的进程。