Deve-se observar que a substituição do processo não se limita ao formulário <(command)
, que usa a saída command
como um arquivo. Pode estar no formato >(command)
que alimenta um arquivo como entrada command
também. Isso também é mencionado na citação do manual do bash na resposta do @ enzotib.
Para o date | cat
exemplo acima, um comando que usa a substituição de processo do formulário >(command)
para obter o mesmo efeito seria,
date > >(cat)
Observe que o >
antes >(cat)
é necessário. Isso pode ser novamente ilustrado claramente echo
como na resposta de @ Caleb.
$ echo >(cat)
/dev/fd/63
Portanto, sem o extra >
, date >(cat)
seria o mesmo date /dev/fd/63
que imprimirá uma mensagem para stderr.
Suponha que você tenha um programa que apenas use nomes de arquivos como parâmetros e não processe stdin
ou stdout
. Usarei o script simplificado demais psub.sh
para ilustrar isso. O conteúdo de psub.sh
é
#!/bin/bash
[ -e "$1" -a -e "$2" ] && awk '{print $1}' "$1" > "$2"
Basicamente, ele testa se ambos os seus argumentos são arquivos (não necessariamente arquivos regulares) e, se esse for o caso, escreva o primeiro campo de cada linha "$1"
para "$2"
usar o awk. Então, um comando que combina tudo o que foi mencionado até agora é,
./psub.sh <(printf "a a\nc c\nb b") >(sort)
Isso imprimirá
a
b
c
e é equivalente a
printf "a a\nc c\nb b" | awk '{print $1}' | sort
mas o seguinte não funcionará, e temos que usar a substituição de processo aqui,
printf "a a\nc c\nb b" | ./psub.sh | sort
ou sua forma equivalente
printf "a a\nc c\nb b" | ./psub.sh /dev/stdin /dev/stdout | sort
Se ./psub.sh
também ler stdin
além do mencionado acima, esse formulário equivalente não existe e, nesse caso, não podemos usar nada em vez da substituição do processo (é claro que você também pode usar um pipe nomeado ou um arquivo temporário, mas isso é outro história).