Sto riscontrando un comportamento strano utilizzando Cygwin x64 2.9.0 su Windows 10 Pro x64. Il comando che sto tentando di eseguire è il seguente:
tac <file> | grep -q -m1 -F "literal string"
Il comando sopra ha esito positivo su tutti i piccoli file che lancio (piccolo significa <= 15kB). Ha anche successo se l'occorrenza finale di literal string
è vicino all'inizio del file (ad esempio, literal string
appare nella parte superiore del file e da nessun'altra parte). Infine, riesce anche quando nessuno dei flag { -q
, -m1
} viene passato al grep
comando.
Tuttavia, quando il file è di circa 680 KB e literal string
appare vicino alla fine del file, il tac
comando stampa "tac: errore di scrittura" su STDERR. Nonostante questo errore, sembra che il comando sia riuscito, stampando la riga corrispondente sull'output (quando il -q
flag viene omesso) e ottenendo il valore di ritorno appropriato da grep
.
Ulteriori test hanno rivelato che questo stesso errore si verifica durante l'utilizzo cat
, ad eccezione del fatto che literal string
deve apparire vicino all'inizio del file per generare l'errore, e l'errore generato è "cat: errore di scrittura: nessuno spazio lasciato sul dispositivo".
Si noti che ciò si verifica solo se almeno una delle opzioni { -m1
, -q
} viene passata al grep
comando, la corrispondenza si trova vicino alla prima riga elaborata del file (poiché cat
è vicino all'inizio, tac
perché è vicino alla fine) e il il file è grande.
Ho eseguito il df
comando e riporta 14 MB disponibili sull'unità Cygwin, con 60 GiB liberi sul disco effettivo. So che potrei semplicemente reindirizzare STDERR al dispositivo NUL, ma sembra un bizzarro rimedio. Qualcuno sa come risolverlo correttamente?
INIZIA MODIFICA
Ho trovato un'altra segnalazione dello stesso errore a partire da maggio 2017, ma non è stata presentata alcuna soluzione. L'OP dell'altro post indica che pensa che questa sia una limitazione della dimensione del buffer delle pipe (forse su Windows, forse su Cygwin).