A substituição do processo não é especificada pelo POSIX, então nem todos os shell POSIX suportam, apenas alguns shells como bash , zsh , ksh88 , ksh93 support.
Em Centos system, /bin/sh é um link simbólico para /bin/bash . Quando bash é invocado com o nome sh , bash entra no modo posix ( Arquivos de Inicialização Bash - Invocados com o nome sh ). No modo posix, process substitution não é suportado, causa erro de sintaxe.
O script deve funcionar se você chamar bash diretamente bash test.sh . Se não, talvez bash tenha entrado no modo posix. Isso pode ocorrer se você iniciar bash com --posix argumento ou variável POSIXLY_CORRECT definida quando bash iniciar:
$ bash --posix test.sh
test.sh: line 54: syntax error near unexpected token '('
test.sh: line 54: 'paste <(printf "%s\n" "TOP")'
$ POSIXLY_CORRECT=1 bash test.sh
test.sh: line 54: syntax error near unexpected token '('
test.sh: line 54: 'paste <(printf "%s\n" "TOP")
Ou bash é criado com a opção --enable-strict-posix-default .
Aqui, você não precisa de substituição de processo, você pode usar canais de shell padrão:
printf "%s\n" "TOP" | paste -
- é a maneira padrão de informar paste para ler os dados do stdin. Com algumas implementações de paste , você pode omiti-lo embora não seja o padrão.
Onde seria útil ao colar a saída de mais de um comando, como em:
paste <(cmd1) <(cmd2)
Em sistemas que suportam /dev/fd/n , isso pode ser feito em sh com:
{ cmd1 4<&- | { cmd2 3<&- | paste /dev/fd/3 -; } 3<&0 <&4 4<&-; } 4<&0
(é o que <(...) faz internamente).