Git pre-push钩子中read命令未等待用户输入直接跳过的问题咨询
Git pre-push钩子中read命令不等待输入的问题解决
问题原因
Git在执行钩子脚本时,会将脚本的**标准输入(stdin)**重定向为Git内部的数据流(而非用户的交互式终端)。当read命令尝试从stdin读取内容时,会直接读到EOF(文件结束符),导致变量response为空,脚本直接进入退出分支。而手动运行脚本时,stdin默认连接到终端,所以能正常等待输入。
解决方案
让read命令直接从用户终端设备(/dev/tty)读取输入,而非依赖Git提供的stdin。以下是两种可行的修改方式:
方式1:单独为read命令指定输入源
修改后的pre-push脚本:
#!/bin/bash echo "Do you want to continue (o/n) ?" # 明确从终端读取输入 read -r response </dev/tty if [[ "$response" =~ ^[oO]$ ]]; then echo "Continue ...." else echo "Stop !!!!" exit 1 fi exit 0
方式2:全局重定向脚本输入到终端
在脚本开头添加输入重定向,让整个脚本的输入都来自终端:
#!/bin/bash # 将脚本的标准输入重定向到终端 exec < /dev/tty echo "Do you want to continue (o/n) ?" read -r response if [[ "$response" =~ ^[oO]$ ]]; then echo "Continue ...." else echo "Stop !!!!" exit 1 fi exit 0
额外注意事项
- 确保脚本使用
#!/bin/bash作为解释器:[[ ]]是Bash的扩展语法,部分系统的/usr/bin/sh是Dash等轻量Shell,不支持该语法。 - 给钩子脚本添加可执行权限:运行
chmod +x .git/hooks/pre-push确保Git能执行该脚本。
内容的提问来源于stack exchange,提问作者mnekkach
相关产品推荐
相关产品推荐

