重定向到使用 /dev/tty 的脚本

Redirect to a script that uses /dev/tty

我正在编写一个可能需要人工输入的 git 挂钩。根据 this answer,必须在该脚本中使用 exec < /dev/tty。这完成了工作,但现在不可能将标准输出重定向到该挂钩(用于测试目的)。我想这个问题可以缩小为一个问题:如何以另一个进程可以读取的方式将消息发送到 /dev/tty?不确定这是否可能。

这是最小的可重现示例:

# file: target.sh

exec < /dev/tty # we want to use /dev/tty
read -p  "Type a message: " message
echo "The message ${message}"

我尝试了几种这样的解决方案:

echo -e "foo\n"| tee /dev/tty | source target.sh

它实际上在 read 提示后在控制台中打印消息,但 message 变量仍未设置。有什么办法可以解决吗?

您可以将输入文件设为可选参数:

#!/bin/bash

input_file=${1:-/dev/tty}
read -p  "Type a message: " message < "${input_file}"
echo "The message ${message}"

# other stuff ...

现在像这样测试命令:

your_script
your_script <(echo foo)
some_cmd | your_script
some_cmd | your_script <(echo foo)

PS:我使用的语法 <(echo foo) 是所谓的 process substitution.

您可以使用expect来实现结果:

#!/bin/bash

expect << EOF
spawn bash target.sh
expect {
    "Type a message: " {send "foo\r"; interact}
}
EOF