我有一个脚本(让我们命名它parent.sh
),它根据输入参数调用一些其他脚本。
最后,它调用脚本child.sh
。
child.sh
如果发现某些文件已经存在,则请求用户输入:
"Would you like to replace the configuration file with a new one? (Yes/No/Abort): "
现在,我想做的是模拟击键“是”/“y”在脚本内部parent.sh
,以便始终覆盖文件。
我不能使用expect
。
我怎样才能做到这一点?
答案1
虽然yes | child.sh
作为工作的人已经评论是一个有效的解决方案,从程序员的角度来看,我将进行修补child.sh
以能够处理这个用例。
比如添加一个--force
不提示但总是覆盖文件的选项。
但要回答你的问题的主题,并得到更多expect
类似的东西,而不仅仅是y
通过管道点火:
#!/bin/bash
fifo=fifo
mkfifo ${fifo}
exec 3<> ${fifo}
expect="Would you like to replace the configuration file with a new one? (Yes/No/Abort): "
answer="y"
while IFS= read -d $'\0' -n 1 a ; do
str+="${a}"
if [ "${str}" = "${expect}" ] ; then
echo "!!! found: ${str}"
echo ">>> sending answer: ${answer}"
echo "${answer}" >&3
unset str
fi
if [ "$a" = $'\n' ] ; then
echo -n "--- discarding input line: ${str}"
unset str
fi
done < <(./child.sh <${fifo})
rm ${fifo}
我只是写了这个..所以它并不是真正的故障安全或针对解决特定问题进行了测试..所以使用时需要您自担风险 8) 在某些条件下可能会出现一些行缓冲问题..
但至少它在我的测试场景中有效。