GNU/Linux >> Linux Esercitazione >  >> Linux

Sostituzione del processo e tubo?

Mi chiedevo come capire quanto segue:

Convogliare lo stdout di un comando nello stdin di un altro è una tecnica
potente. Ma cosa succede se è necessario reindirizzare lo stdout di più comandi
? È qui che entra in gioco la sostituzione del processo.

In altre parole, la sostituzione del processo può fare qualsiasi cosa la pipe possa fare?

Cosa può fare la sostituzione del processo, ma pipe no?

Risposta accettata:

Un buon modo per fare la differenza tra loro è fare un po' di esperimenti sulla riga di comando. Nonostante la somiglianza visiva nell'uso del < carattere, fa qualcosa di molto diverso da un reindirizzamento o una pipe.

Usiamo la date comando per il test.

$ date | cat
Thu Jul 21 12:39:18 EEST 2011

Questo è un esempio inutile ma mostra che cat accettato l'output di date su STDIN e sputalo indietro. Gli stessi risultati possono essere ottenuti sostituendo il processo:

$ cat <(date)
Thu Jul 21 12:40:53 EEST 2011

Tuttavia, quello che è appena successo dietro le quinte è stato diverso. Invece di ricevere un flusso STDIN, cat è stato effettivamente passato il nome di un file che doveva essere aperto e letto. Puoi vedere questo passaggio usando echo invece di cat .

$ echo <(date)
/proc/self/fd/11

Quando cat ha ricevuto il nome del file, ha letto il contenuto del file per noi. D'altra parte, echo ci ha appena mostrato il nome del file che è stato passato. Questa differenza diventa più evidente se aggiungi più sostituzioni:

$ cat <(date) <(date) <(date)
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011

$ echo <(date) <(date) <(date)
/proc/self/fd/11 /proc/self/fd/12 /proc/self/fd/13

È possibile combinare la sostituzione del processo (che genera un file) e il reindirizzamento dell'input (che collega un file a STDIN):

$ cat < <(date)
Thu Jul 21 12:46:22 EEST 2011

Sembra più o meno lo stesso, ma questa volta cat è stato passato al flusso STDIN anziché al nome di un file. Puoi vederlo provandolo con echo:

$ echo < <(date)
<blank>

Poiché echo non legge STDIN e non è stato passato alcun argomento, non otteniamo nulla.

Pipe e reindirizzamenti di input spingono il contenuto nel flusso STDIN. La sostituzione del processo esegue i comandi, salva il loro output in un file temporaneo speciale e quindi passa quel nome di file al posto del comando. Qualunque comando tu stia usando lo considera come un nome di file. Nota che il file creato non è un file normale ma una named pipe che viene rimossa automaticamente quando non è più necessaria.

Correlati:gli eventi filtrati in Process Monitor sono archiviati in memoria o su disco?
Linux
  1. `^m` E come sbarazzartene?

  2. Un Superblock, Inode, Dentry e un file?

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

  4. Permessi e salvataggio dei file?

  5. Reindirizzamento e uscita del tubo?

Come ottenere la data e l'ora correnti in Python

Inventario Ansible e file di configurazione

Come impostare data e ora su Linux

Thread e descrittori di file

Creazione di file temporanei rispetto alla sostituzione del processo rispetto all'espansione variabile?

Scarica la memoria di un processo Linux su file