Zmiana procesu nie POSIX, dlatego nie wszystkie powłoki POSIX wspiera się tylko niektóre, takie jak muszle bash
, zsh
, ksh88
, ksh93
wsparcie.
W Centos
systemie /bin/sh
jest dowiązanie symboliczne do /bin/bash
. Kiedy bash
jest wywoływany z nazwą sh
, bash
przechodzi w tryb posiksowy ( Bash Startup Files - wywoływany z nazwą sh ). W trybie POSIX process substitution
nie jest obsługiwany, powoduje błąd składniowy.
Skrypt powinien działać, jeśli zadzwonisz bash
bezpośrednio bash test.sh
. Jeśli nie, być może bash
wszedł w tryb posiksowy. Może się to zdarzyć, jeśli zaczynasz bash
od --posix
argumentu lub zmienna POSIXLY_CORRECT
jest ustawiona podczas bash
uruchamiania:
$ 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")
Lub bash
jest zbudowany z --enable-strict-posix-default
opcją.
Tutaj nie potrzebujesz podstawiania procesów, możesz użyć standardowych potoków powłoki:
printf "%s\n" "TOP" | paste -
-
to standardowy sposób paste
na odczytanie danych ze standardowego wejścia. W przypadku niektórych paste
implementacji można to pominąć, choć nie jest to standardowe.
Przydałoby się wkleić dane wyjściowe więcej niż jednego polecenia, np .:
paste <(cmd1) <(cmd2)
W systemach, które obsługują /dev/fd/n
, można to zrobić za sh
pomocą:
{ cmd1 4<&- | { cmd2 3<&- | paste /dev/fd/3 -; } 3<&0 <&4 4<&-; } 4<&0
(to, co <(...)
robi wewnętrznie).
dash
Zamiastbash
).