2016-05-24 21 views
7

Supponendo abbiamo il seguente frammento di codice con un file di testo sample.txt reindirizzato in STDIN:Perché alcuni comandi elaborano linee di dati STDIN reindirizzati che sono già stati utilizzati da altri comandi?

@echo off 
< "sample.txt" (
    set /P "ONE=" 
    set /P "TWO=" 
    findstr /R "^" 
) 
echo %ONE%, %TWO% 

... e il contenuto del file di testo relativi sample.txt:

first 
second 
third 
fourth 

L'uscita restituito il console sarà questo, che è esattamente quello che mi aspetto (le righe first e second sono consumate da set /P, quindi findstr riceve ed elabora le righe rimanenti):

third 
fourth 
first, second 

La stessa uscita si ottiene quando findstr /R "^" è sostituito da sort /R.

Tuttavia, quando si sostituisce la linea findstr comando find /V "" o more, l'uscita sarà:

first 
second 
third 
fourth 
first, second 

Sembra che, sebbene set /P già consumato le linee first e second che è dimostrato dai l'ultima linea di uscita, find e anche more continuano a ricevere gli interi dati reindirizzati.

Perché questo è ciò che causa questo comportamento? C'è un modo per forzare find o more per ricevere solo i restanti dati reindirizzati che non sono già stati elaborati da un comando precedente?

(il comportamento è lo stesso quando reindirizzare i dati in uscita STDOUT un file di testo. Inoltre, durante l'esecuzione di una riga di comando simile al codice batch precedente in cmd direttamente, non cambia nulla.)

+1

Si può leggere una descrizione di questo comportamento [qui] (http://stackoverflow.com/questions/8844868/what-are-the-undocumented-features-and-limitations-of-the-windows-findstr-comman/28278628 # 28278628), ma la risposta alla tua domanda è: "perché tali comandi sono stati programmati in questo modo" – Aacini

+0

Molto interessante, @Aacini! Ho già sospettato che 'find' e' more' resettassero il puntatore del file, perché giocavo con tutti i comandi che ho menzionato, li ho mixati e riordinati, e ho persino avvolto un 'for/F' attorno a loro (come:' per/F "delim =" %% L in ('more') fa echo (%% L'), che non ha cambiato nulla.Quindi temo che non ci sia alcun modo (nativo) per aggirare questo comportamento? – aschipfl

+1

Si potrebbe provare a pipe il risultato di 'findstr/R"^"' per 'trovare/V" "' o 'more' –

risposta

1

Perché fare un po ' comandi elaborano linee di dati STDIN reindirizzati che sono già stati utilizzati da altri comandi?

Perché alcuni comandi/programmi riavvolgono lo stdin. Si può provare questo:

@echo off 
< "sample.txt" (
    set /P "ONE=" 
    set /P "TWO=" 
    more +2 
) 
echo %ONE%, %TWO% 

Risultato:

third 
    fourth 
    first, second 

Il more +2 salta le prime due righe del file.

+0

Per "echo% ONE%,%", in realtà si intende "echo% ONE%,% TWO%", giusto? Questa è una buona soluzione per il codice in questione, ma 'more' continua a rielaborare tutti i dati (riceve tutte le righe, salta solo due righe dal suo output) ... – aschipfl

+0

@aschipfl, sì, avrebbe dovuto essere'% DUE% 'non'% ', mi mancava. Ho appena modificato la risposta. Sì, 'more' continua a riavvolgere lo stdin, per elaborare l'intero file. Ad ogni modo, penso che sia la risposta alla tua domanda, alcuni programmi non si comportano come filtri appropriati in una catena di condutture. – jwdonahue

Problemi correlati