csh 中不明确的输入重定向错误

csh 中不明确的输入重定向错误
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,因此您需要选择必须提供输入的进程。

相关内容