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).