read
Here's a simple shell script to stream data to multiple processes. It has many applications, but the reason I wrote it is to stream the same data to multiple netcat processes on remote machines.
Here's the code:
#!/bin/bash usage() { cat <<EOF>&2 usage : multi-fifo target0 [target1 [target2 [...]]] Where each targetN is a program you want to send the input multi-fifo receives EOF } [ $# -eq 0 ] && usage && exit 1 i=0 pipeline="tee /dev/null" while [ -n "$1" ]; do target=$1 fifo=/tmp/multi-fifo-$$.$i mkfifo $fifo eval "$target < $fifo" & pipeline="$pipeline | tee $fifo" i=$((i+1)) shift done eval "cat | $pipeline" j=0 while [ $j -lt $i ]; do rm -f /tmp/multi-fifo-$$.$j j=$((j+1)) done
Usage is pretty straightforward:
tar cjvf - . | ./multi-fifo "nc host1 9999" "nc host2 9999" >/dev/null
This way, the script will create a fifo for each netcat client, then send it's stdin to a pipeline that writes to both fifos using tee. Useful for example if you want to stream a backup to multiple destination servers for cloning.