重定向到使用 /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
我正在编写一个可能需要人工输入的 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