2016-05-02 15 views
6

Script e l'uscita è, come di seguito:comando tee non funziona come previsto (con lettura e eco)

Script:

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

uscita:

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

sto cercando di aggiungere uscita in logfile. Tuttavia, come puoi vedere in uscita, sembra che la prima lettura sia corretta e poi echo che non è come previsto.

Sto usando Git Bash versione 3.1.23 su Windows 10. Poiché named pipe non è disponibile in questa versione, non posso utilizzare named pipe per scopi di registrazione.

+2

'read' visualizza il suo prompt stderr. Il tuo 'echo' viene visualizzato sullo stdout. – bishop

risposta

9

read -p sta scrivendo è in uscita su stderr e echo sta scrivendo a stdout. stdout viene in genere memorizzato nel buffer mentre stderr non lo è, quindi non è raro vedere le cose stderr prima dello stdout.

si potrebbe avere il echo andare anche a stderr se ti piace facendo echo "string" >&2 o si potrebbe farlo funzionare negli strumenti di comando o simili unbuffer se avete a disposizione

+0

Ho capito. Quindi potrei anche scrivere "echo" *** Questo dovrebbe essere stampato per primo, ora sarà *** "; echo -n "Enter Input:"; leggi -r; 'per ottenere risultato atteso. – ss005

+0

Giusto, perché poi tutto sta per 'stdout' e verrà ordinato direttamente nello stream (inoltre, è tutto quindi su' stdout', che è ciò che 'tee' si aspetta nel tuo caso d'uso) –

+0

Oppure, solo un altro supplente 'tee_test 2> & 1 | tee -a logfile' Grazie Renouf :) – ss005