2017-10-25 4 views
0

Für meinen Zweck muss ich einen Shell-Befehl ausführen, um die Ausgabe zu erreichen, und für jede Zeile fragen Benutzer für Eingabeaufforderung. Das Problem besteht darin, dass auf die Aufforderung lesen, stdin Puffer nicht leer istWie kann ich den Benutzer innerhalb einer Weile Lese Schleife?

dies ist mein Code:

#!/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 

Die Linie:

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

auch nicht auf Video anzeigen und prompt variable zeigen das Ergebnis der obigen Zeilenvariablen an. Wie kann ich dieses Problem lösen?

Antwort

1

eine FD ungleich 0 (stdin) Verwenden Sie die ursprüngliche stdin frei für Eingaben vom Benutzer zu verlassen:

#!/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) 

Hier sind wir FD 3 für die Ausgabe von git verwenden, so dass FD 0 ist immer noch stdin, verfügbar, um vom Benutzer zu lesen; und dann umleiten <&3 auf die explizite read, wo wir Inhalt von git wollen.

+0

(Markiert Community Wiki Ernte rep von einem bekannten Betrogene zu vermeiden) –

+0

Empfang dieser Fehler auf letzte Zeile Syntaxfehler in der Nähe von unerwartetem Token '3' –

+0

@fstarred, was ist Ihre Shell? '<()' ist Bash-Only-Syntax; Es funktioniert nicht mit '/ bin/sh'. (Sie haben Ihre Frage bash markiert, also sollten Sie */bin/sh nicht verwenden). –

Verwandte Themen