2016-05-02 11 views
6

Script i wyjście jest jak poniżej:polecenia tee nie działa zgodnie z oczekiwaniami (z odczytu i echo)

Scenariusz:

#!/bin/bash 
#tee_with_read.sh 
function tee_test() 
{ 
    echo "***This should be printed first but it is not***" 
    read -r -p "Enter input : " 
    echo "You entered : $REPLY" 
} 
tee_test | tee -a logfile 

wyjściowa:

$ ./tee_with_read.sh 
Enter input : ***This should be printed first, but it is not*** 
"My Input" 
You entered : "My Input" 

staram się dołączyć wyjście do pliku logu. Ale jak widać w ouput, wygląda na to, że pierwszy odczyt zostaje sprawdzony, a następnie echo, które nie jest zgodne z oczekiwaniami.

Używam Git Bash w wersji 3.1.23 na Windows 10. Ponieważ nazwany potok nie jest dostępny w tej wersji, nie mogę użyć nazwanego potoku do celów rejestrowania.

+2

'read' wyświetla jego wiersz na stderr. Twoje 'echo' wyświetla się na standardowe wyjście. – bishop

Odpowiedz

9

read -p zapisuje wynik do stderr, a echo pisze do stdout. stdout jest zwykle buforowany, gdy stderr nie jest, więc często zdarza się, że rzeczy pojawiają się przed stdout.

Można mieć swoją echo również przejść do stderr jeśli lubisz wykonując echo "string" >&2 lub można go uruchomić w unbuffer polecenia lub podobnych narzędzi, jeśli masz je dostępne

+0

Mam to. Mogłabym też napisać "echo" *** To powinno być wydrukowane najpierw, teraz będzie *** "; echo -n "Wprowadź dane wejściowe:"; przeczytaj -r; ', aby uzyskać oczekiwany wynik. – ss005

+0

Dobrze, ponieważ wtedy wszystko będzie "stdout" i zostanie zamówione bezpośrednio w strumieniu (również, to wszystko to na 'stdout', które jest tym, czego' tee' będzie oczekiwał w twoim przypadku użycia) –

+0

Lub, po prostu inny zastępca 'tee_test 2> & 1 | tee -a logfile' Dzięki Renouf :) – ss005

Powiązane problemy