Подстановка процессов не определен POSIX, поэтому не поддерживает все POSIX оболочки, только некоторые оболочки , как bash, zsh, ksh88, ksh93поддержка.
В Centosсистеме /bin/shесть символическая ссылка на /bin/bash. Когда bashвызывается с именем sh, bashпереходит в режим posix ( Bash Startup Files - вызывается с именем sh ). В режиме posix,process substitution не поддерживается, вызывает синтаксическую ошибку.
Скрипт должен работать, если вы звоните bashнапрямую bash test.sh. Если нет, возможно bash, перешел в режим posix. Это может произойти, если вы начинаете bashс --posixаргумента или переменная POSIXLY_CORRECTустановлена при bashзапуске:
$ 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")
Или bashпостроен с --enable-strict-posix-defaultопцией.
Здесь вам не нужно подменять процессы, вы можете использовать стандартные каналы оболочки:
printf "%s\n" "TOP" | paste -
-это стандартный способ сказать, pasteчтобы прочитать данные из стандартного ввода. В некоторых pasteреализациях вы можете опустить его, хотя это не стандартно.
Это было бы полезно при вставке вывода более чем одной команды, например:
paste <(cmd1) <(cmd2)
На системах, которые поддерживают /dev/fd/n, это можно сделать shс помощью:
{ cmd1 4<&- | { cmd2 3<&- | paste /dev/fd/3 -; } 3<&0 <&4 4<&-; } 4<&0
(это то, что <(...)делает внутренне).
dashвместоbash).