Подстановка процессов не определен 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
).