2009-08-19 15 views
11

In a post's risposta su superuser.com, vediamo cheChe cosa fa <() in Bash?

join <(sort abc) <(sort bcd) 

sarà ordinare i file ABC e BCD prima di inviarli ad unirsi. Questo porta a una domanda di programmazione, più adatta allo stackoverflow.

Come funziona? Che cosa è esattamente questo costrutto <()? Come si chiama?

Se (sort abc) è una chiamata legale che esegue sort su abc e restituisce output, perché abbiamo bisogno del <?

Cioè, le seguenti due righe sono equivalenti

(sort abc) | join - <(sort bcd) 
join <(sort abc) <(sort bcd) 

ma

join (sort abc) (sort bcd) 

è un errore di sintassi. Per favore, indicalo!

+1

Che fine ha fatto la buona vecchia tradizione di leggere il bel manuale per una conchiglia? – Jens

risposta

21

Questo è chiamato processo di sostituzione.

<(list) è un singolo costrutto di sintassi, il '<' carattere non è un simbolo separato in questo caso. Esegue lista e fornisce il suo output come una sorta di file (non un reindirizzamento standard) al comando.

E 'l'equivalente di (tranne che utilizza tubi al posto dei file temporanei quando possibile):

sort abc > /tmp/1 
sort bcd > /tmp/2 
join /tmp/1 /tmp/2 

Si noti che l'uscita di entrambi i tipi sono forniti come i nomi dei file di unirsi, redirezioni non come standard.

(list) è un costrutto diverso, per uno scopo diverso. Crea semplicemente una subshell che esegue lista, fornendo i suoi descrittori standard alla shell genitore.

Here è la parte pertinente nel manuale di bash.

5

<(command) Sostituzione processo (vedere la sezione secondo in man bash). Fondamentalmente comando viene eseguito e la sua uscita viene alimentata ad una pipa denominata (FIFO), e l'intero costrutto viene poi sostituito con il nome del tubo, con il risultato di join /dev/fd/x /dev/fd/y.