2014-04-12 12 views
5

Przepraszam z góry - nie w pełni rozumiem idee stojące za tym, o co pytam, na tyle dobrze, aby zrozumieć, dlaczego to nie działa (Nie wiem czego muszę się nauczyć). Najpierw przeszukałem wymianę stosów, szukając odpowiedzi - znalazłem informacje, które wydawały mi się odpowiednie, ale nie wyjaśniłem wystarczająco dobrze koncepcji, że zrozumiałem, jak zbudować działające rozwiązanie. Przeszukałem Google'a, ale nie znalazłem żadnych informacji, które opisują dokładnie to, co się dzieje w taki sposób, jaki rozumiem. Każdy kierunek pojęć tła, które mogą mi pomóc zrozumieć, co się dzieje, byłby bardzo doceniony.Używanie read -p w skrypcie basha, który został wykonany z rury

Czy można uzyskać dane wejściowe użytkownika w skrypcie bash, który został wykonany z potoku?

Na przykład:

wget -q -O - http://myscript.sh | bash 

I w skrypcie:

read -p "Do some action (y/n): " __response 
if [[ "$__response" =~ ^[Yy]$ ]]; then 
    echo "Performing some action ..." 
fi 

Jak rozumiem, to nie działa, ponieważ próby odczytu Aby odczytać dane wejściowe z stdin i skrypt bash jest obecnie "wykonywany przez tę rurkę" (jestem pewien, że istnieje bardziej techniczny dokładny sposób opisywania tego, co się dzieje, ale nie wiem jak).

znalazłem rozwiązanie, które zalecił stosowanie:

read -t 1 __response </dev/tty 

Jednak to nie działa albo.

Każde światło rzucające się na pojęcia, które muszę zrozumieć, aby to zadziałało, lub wyjaśnienia, dlaczego nie działa lub rozwiązania byłyby bardzo mile widziane.

Odpowiedz

3

Działa rozwiązanie tty. Przetestować go z tego kodu, na przykład:

$ date | { read -p "Echo date? " r </dev/tty ; [ "$r" = "y" ] && cat || echo OK ; } 
Echo date? y 
Sat Apr 12 10:51:16 PDT 2014 
$ date | { read -p "Echo date? " r </dev/tty ; [ "$r" = "y" ] && cat || echo OK ; } 
Echo date? n 
OK 

Monit z read na terminalu pojawia się i read czeka na odpowiedź przed podjęciem decyzji o echo datę lub nie.

co napisałem powyżej różni się od poniżej linii w dwóch kluczowych aspektach:

read -t 1 __response </dev/tty 

Pierwsza opcja -t 1 daje read timeout od jednej sekundy. Po drugie, to polecenie nie zapewnia zachęty. Kombinacja tych dwóch prawdopodobnie oznacza, że ​​pomimo tego, że read krótko poprosił o dane wejściowe, nie wiedziałeś o tym.

+0

Dziękuję. Działa świetnie. – nfarrar