Bash 脚本不会在输入命令时退出

Bash script won't exit on input command

我有一个 bash 脚本 运行 在 git post-commit 挂钩上。它所做的是要求用户输入,并根据输入触发另一个动作并退出。

问题是当操作为 运行 时它不会退出,这意味着当例如输入 0 npm version patch 运行s 并完成但脚本挂在那里。必须使用 ctrl+c 手动关闭它才能退出脚本。

这是我的脚本:

#!/bin/sh

echo "
Script app versioning started! 
"

exec < /dev/tty

while true; do   
read -p "What version should the project update to? 
    - patch[x.x.1] press 0
    - minor[x.1.x] press 1  
    - major[1.x.x] press 2
    - skip patching press 3
    " answer
    case $answer in
            [0] ) 
            npm version patch ;
            exit 0;;
            [1] ) npm version minor;
            exit 0;;
            [2] ) npm version major;
            exit 0;; 
            [3] ) echo "No version patched";
            exit 0;;
            * ) echo "Please answer 0, 1 or 2.";;
    esac
done

echo "
Script app versioning ended!
"
exit 0

是否由于命令 exec < /dev/tty 的重定向,当输入 0,1 或 2 并且 npm version patch 命令将中断输出,所以它将继续而没有 exit 0 被触发并挂起? 如果是这样,我该如何解决?试图像 exec > /dev/tty 一样将输出重定向回来,但没有用。

删除 exec < /dev/tty 将 运行 脚本并退出,但不会等待我的命令输入。

我已经通过像这样重定向回我的标准输出来修复我的脚本:

#!/bin/sh

echo "
Script app versioning started! 
"

exec < /dev/tty

while true; do   
read -p "What version should the project update to? 
    - patch[x.x.1] press 0
    - minor[x.1.x] press 1  
    - major[1.x.x] press 2
    - skip patching press 3
    " answer
    case $answer in
            [0] ) 
            npm version patch ;
            exit 0;;
            [1] ) npm version minor;
            exit 0;;
            [2] ) npm version major;
            exit 0;; 
            [3] ) echo "No version patched";
            exit 0;;
            * ) echo "Please answer 0, 1 or 2.";;
    esac
done  < "${1:-/dev/stdout}"