A volte la sostituzione del processo non funzionerà come previsto. Ecco un esempio:
Inserimento:
gcc <(echo 'int main(){return 0;}')
Uscita:
/dev/fd/63: file not recognized: Illegal seek
collect2: error: ld returned 1 exit status
Inserimento:
Ma funziona come previsto se utilizzato con un comando diverso:
grep main <(echo 'int main(){return 0;}')
Uscita:
int main(){return 0;}
Ho notato errori simili con altri comandi (ad es. il comando che prevede il file dalla sostituzione del processo non può utilizzare /dev/fd/63
o simili). Questo errore con gcc
è solo il più recente. C'è qualche regola generale di cui dovrei essere a conoscenza 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 vista anche in arch e debian):
GNU bash, versione 4.3.11(1)-release (i686-pc-linux-gnu)
Risposta accettata:
La sostituzione del processo genera un file speciale (come /dev/fd/63
nel tuo esempio) che si comporta come l'estremità di lettura di una pipe denominata. Questo file può essere aperto e letto, ma non scritto, non cercato.
I comandi che trattano i loro argomenti come flussi puri funzionano mentre i comandi che si aspettano di cercare nei file che vengono dati (o di scriverli) non funzioneranno. Il tipo di comando che funzionerà è quello che di solito è considerato un filtro:cat
, grep
, sed
, gzip
, awk
, ecc... Un esempio di comando che non funzionerà è un editor come vi
o un'operazione su file come mv
.
gcc
vuole essere in grado di eseguire un accesso casuale sui suoi file di input per rilevare in quale lingua sono scritti. Se invece dai gcc
un suggerimento sulla lingua del file di input, è felice di eseguire lo streaming del file:
gcc -x c <(echo 'int main(){return 0;}')
Funziona anche la forma più semplice e diretta senza sostituzione del processo:
echo 'int main(){return 0;}' | gcc -x c -
Nota che questo non è specifico di bash
. Tutte le shell che supportano la sostituzione dei processi si comportano allo stesso modo.