Se ho capito bene, si sta guardando per l'equivalente di tee file1 file2 file3
, ma invece di scrivere gli stessi dati a tre file file1
, file2
e file3
, si vuole tubo gli stessi dati in tre comandi cmd1
, cmd2
e cmd3
, cioè
… | ??? cmd1 cmd2 cmd3
dovrebbe essere equivalente a
… | cmd1 &
… | cmd2 &
… | cmd3 &
tranne che …
sarebbe eseguito solo una volta.
Ci sono due modi per farlo.
Ksh93, bash e zsh supportano la sostituzione del processo . Questa è una generalizzazione di pipe che consente all'argomento di un comando di essere un file che, quando scritto, passa i dati come input a un comando (esiste anche la variante di input che, quando viene letta, ottiene l'output di dati da un comando) . Questo è,
echo hello | tee >(cmd1)
stampe hello
standard output e in aggiunta corre cmd1
con hello
come input.
Ad esempio, se si desidera duplicare l'input di somecommand
e passarlo a entrambi cmd1
e cmd2
, è possibile utilizzare
somecommand | tee >(cmd1) | cmd2
Se la shell non supporta la sostituzione dei processi, è possibile utilizzare invece named pipe. Vedi la risposta di Arcege per come funziona. Le pipe nominate sono meno convenienti della sostituzione del processo perché è necessario crearle ed eliminarle, nonché avviare e sincronizzare i processi manualmente. Hanno il vantaggio di essere completamente portatili, mentre non tutte le shell supportano le sostituzioni di processo. Possono anche essere utilizzati in scenari diversi da quelli previsti per la sostituzione del processo.
Sotto il cofano, su alcuni sistemi, la sostituzione del processo utilizza internamente pipe denominate. Sulla maggior parte dei sistemi, tuttavia, si basa su file denominati che rappresentano descrittori di file .