A volte la sostituzione del processo non funzionerà come previsto. Ecco un esempio:
Ingresso:
gcc <(echo 'int main(){return 0;}')
Produzione:
/dev/fd/63: file not recognized: Illegal seek
collect2: error: ld returned 1 exit status
Ingresso:
Ma funziona come previsto se utilizzato con un comando diverso:
grep main <(echo 'int main(){return 0;}')
Produzione:
int main(){return 0;}
Ho notato simili errori con altri comandi (cioè il comando che si aspetta il file dalla sostituzione del processo non può usare /dev/fd/63
o simile). Questo fallimento con gcc
è solo il più recente. Esiste una regola generale di cui dovrei essere consapevole per determinare quando la sostituzione del processo fallirà in questo modo e non dovrebbe essere utilizzata?
Sto usando questa versione BASH su Ubuntu 12.04 (l'ho visto anche in arch e debian):
GNU bash, versione 4.3.11 (1) -release (i686-pc-linux-gnu)
gcc -xc <(echo 'int main(){return 0;}')
(che imposta C
esplicitamente la lingua ).
illegal seek
sembra la risposta - quello|pipe
chebash
punta al programma eseguito non è un file ricercabile. probabilmente se non riesci con successoecho data | command /dev/fd/0
a un programma, avrai una fortuna simile con<(cmd)
. Non fornisce un file su disco - sostituisce solo un argomento che punta a un descrittore di file di pipe.