Spesso voglio inviare dati di stringhe relativamente brevi (potrebbero essere diverse righe però) a programmi da riga di comando che accettano solo input da file (ad esempio wdiff) in modo ripetuto. Certo che posso creare uno o più file temporanei, salvare la stringa lì ed eseguire il comando con il nome del file come parametro. Ma mi sembra che questa procedura sarebbe altamente inefficiente se i dati vengono effettivamente scritti sul disco e potrebbe anche danneggiare il disco più del necessario se ripeto questa procedura molte volte, ad es. se voglio inserire righe singole di file di testo lunghi in wdiff. C'è un modo consigliato per aggirare questo problema, ad esempio utilizzando pseudo file come pipe per archiviare temporaneamente i dati senza effettivamente scriverli sul disco (o scriverli solo se supera una lunghezza critica). Nota che wdiff accetta due argomenti e, per quanto ho capito, non sarà possibile alimentare i dati facendo qualcosa come wdiff <"text"
.
Risposta accettata:
Usa una pipe con nome. A titolo illustrativo:
mkfifo fifo
echo -e "hello worldnnext linenline 3" > fifo
Il -e
dice a echo di interpretare correttamente l'escape di nuova riga (n
). Questo si bloccherà, cioè la tua shell si bloccherà finché qualcosa non leggerà i dati dalla pipe.
Apri un'altra shell da qualche parte e nella stessa directory:
cat fifo
Leggerai l'eco, che rilascerà l'altra shell. Sebbene la pipe esista come nodo file su disco, i dati che la attraversano non lo fanno; tutto si svolge nella memoria. Puoi eseguire lo sfondo (&
) l'eco.
La pipe ha un buffer di 64k (su Linux) e, come un socket, bloccherà lo scrittore quando è pieno, quindi non perderai dati finché non ucciderai prematuramente lo scrittore.