Sì, diff <(echo "$foo") <(echo "$bar")
va bene.
Effettuando una ricerca del bash manpage per i personaggi <(
, si può trovare che questo è chiamato “sostituzione di processo.”
Non è necessario preoccuparsi della efficienza di creare un file temporaneo, in quanto il file temporaneo è davvero solo una pipe, non un file su disco. Prova questo:
$ echo <(echo foo)
/dev/fd/63
Questo dimostra che il file temporaneo è in realtà solo il tubo “descrittore di file 63.” Anche se appare sul /dev
filesystem virtuale, il disco non viene mai toccato.
L'effettivo problema di efficienza di cui dovresti preoccuparti qui è la parte "processo" di "sostituzione del processo". Bash forks un altro processo per eseguire lo echo foo
. Su alcune piattaforme, come Cygwin, questo può essere molto lento se eseguito frequentemente. Tuttavia, sulla maggior parte delle piattaforme moderne, l'uso di fork
è piuttosto veloce. Ho solo provato a fare 1000 sostituzioni di processo in una sola volta eseguendo lo script:
echo <(echo foo) <(echo foo) ... 997 repetitions ... <(echo foo)
Ci sono voluti 0.225s sul mio vecchio computer portatile Mac, e 2,3 secondi in una macchina virtuale Ubuntu in esecuzione sullo stesso computer portatile. Dividendo per le 1000 invocazioni, questo mostra che le sostituzioni di processo impiegano meno di 3 millisecondi - qualcosa di completamente sminuito dal runtime di diff
, e probabilmente non c'è nulla di cui preoccuparsi!
grazie per aver spiegato questo! Sulla mia Xeon [email protected] 'volta per i in {0..1000}; do echo <(echo foo); fatto 'ha preso 0,264 s. – Martin
Si noti che anche "echo foo> foo; gatto foo; rm foo' è anche improbabile che tocchi il disco.Se il file temporaneo viene rimosso prima che il file vfs venga scaricato nella partizione fisica, nulla va mai sul piatto. –