bash 脚本中类似“expect”的行为

bash 脚本中类似“expect”的行为

我有一个脚本(让我们命名它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) 在某些条件下可能会出现一些行缓冲问题..

但至少它在我的测试场景中有效。

相关内容