出于我的目的,我需要执行一个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
甚至不显示视频,而提示变量显示上面的行变量的结果。 我该如何解决这个问题?
答案 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
。