GNU/Linux >> Linux Esercitazione >  >> Linux

Perché la sostituzione del processo Bash non funziona con alcuni comandi?

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.


Linux
  1. Perché l'espressione regolare funziona in X ma non in Y?

  2. Perché Cd non è un programma?

  3. Perché il file di traduzione Bash non contiene tutti i testi di errore?

  4. Linux – Perché Setuid non funziona??

  5. Perché il completamento automatico non funziona quando si digita un nome di comando dopo "source"?

La mappatura dei metadati con Avconv non funziona?

Perché Bash non memorizza i comandi che iniziano con spazi?

Perché `esce &` non funziona?

Perché Tomcat funziona con la porta 8080 ma non con la 80?

Perché bash non si ferma in caso di errore per errori nella sequenza di comandi in cortocircuito?

La corrispondenza del modello non funziona nello script bash