我如何自动化 bash 脚本,该脚本来自 /dev/tty 'read'?

How can I automate a bash script that is 'read'-ing from /dev/tty?

我有一个脚本(我无法修改),我必须定期 运行 它具有以下结构:

read -r response < /dev/tty
if [ "$response" = 'y' ]; then
...

我想包装这个脚本,以便我总是向它发送一个“y”字符。我已经尝试 运行 将脚本与发送“是”的标准技巧结合起来:

echo y | '/bin/bash /path/to/script'

yes | ./myscript

printf "y\n" | ./myscript

/bin/bash /path/to/script < /path/to/y-file

None 这些作品。我也试过 expect.

不清楚 Mac OS X' 内置的 expect 是否正常工作;启用 expect 诊断信息后,expect 正确检测到提示并响应,但脚本随后终止。

#!/bin/bash
set timeout -1
SCRIPT="~/myscript"

expect -d <<EOF
spawn $SCRIPT
expect "prompt string"
send "y\r"
EOF

另外,澄清一下,这是在 Mac OS X Monterey。

如有任何帮助,我将不胜感激。同样,我无法修改原始脚本。

您可以使用 socat 为子进程伪造一个新的伪终端。

tty.sh为以下脚本:

#! /bin/bash

read -r response < /dev/tty
if [ "$response" = 'y' ]; then
  echo yes
else
  echo no
fi

然后你可以这样连接stdin到子进程的新pty:

echo y | socat stdio exec:./tty.sh,pty,setsid,echo=0

您可以尝试使用 autoexpect 为您生成包装器(自动脚本)脚本:

autoexpect -f autoscript ./myscript.sh