如何在一段时间的读取循环中提示用户?

时间:2017-10-25 15:25:28

标签: bash

出于我的目的,我需要执行一个shell命令,实现输出,并为每一行询问用户提示。 问题是在读取提示符下,stdin缓冲区不是空的

这是我的代码:

#!/bin/sh

git branch -a | sed 's/remotes\/origin\///g'

echo "############################"

git branch -a | sed 's/remotes\/origin\///g' | while read line
do
        if [[ "$line" != *develop* ]] \
                && [[ "$line" != *master ]] \
                && [[ "$line" != *release/* ]] \
                && [[ "$line" != *hotfix* ]]
        then
                read -r -p "Do you want to delete branch $line <y/N>?" prompt
                echo $prompt
        fi
done

该行:

read -r -p "Do you want to delete branch $line <y/N>?" prompt

甚至不显示视频,而提示变量显示上面的行变量的结果。 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

使用0以外的FD(标准输入),保留原始标准输入以供用户输入:

#!/usr/bin/env bash
#              ^^^^- NOT /bin/sh; also, do not run with "sh scriptname"

while read -r line <&3; do
  line=${line#remotes/origin/}  # trim remotes/origin/ w/o needing sed
  case $line in
    *develop*|*master|*release/*|*hotfix*) continue ;;
    *) read -r -p "Do you want to delete branch $line <y/N>?" prompt
       echo "$prompt" ;;
  esac
done 3< <(git branch -a)

这里,我们使用FD 3来输出git,这样FD 0仍然是stdin,可供用户读取;然后将<&3重定向到我们想要read内容的显式git