我如何自动化 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
我有一个脚本(我无法修改),我必须定期 运行 它具有以下结构:
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