(2 risposte)
Chiuso 2 anni fa.
So che questa è una specie di duplicato di un'altra domanda (perché questo comando di ordinamento mi dà un file vuoto?), ma volevo espandere la domanda in risposta alle risposte fornite.
Il comando
shuf example.txt > example.txt
Restituisce un file vuoto, perché la shell tronca il file prima di mescolarlo, lasciando solo un file vuoto da mescolare. Tuttavia,
cat example.txt | shuf > example.txt
produrrà un file mescolato come previsto.
Perché il metodo della pipeline funziona quando il semplice reindirizzamento non funziona? Se il file viene troncato prima dell'esecuzione dei comandi, anche il secondo metodo non dovrebbe lasciare un file vuoto?
Risposta accettata:
Il problema è che > example.txt
inizia a scrivere su quel file, prima di shuf example.txt
inizia a leggerlo. Quindi, poiché non c'era ancora alcun output, example.txt
è vuoto, shuf
legge un file vuoto e come shuf
non produce output in questo caso, il risultato finale rimane vuoto.
L'altro tuo comando potrebbe soffrire dello stesso problema. > example.txt
potrebbe terminare il file prima di cat example.txt
inizia a leggerlo; dipende dall'ordine in cui la shell esegue queste cose e da quanto tempo impiega cat
per aprire effettivamente il file.
Per evitare del tutto tali problemi, puoi utilizzare shuf example.txt > example.txt.shuf && mv example.txt.shuf example.txt
.
Oppure potresti usare shuf example.txt --output=example.txt
invece.