Kiedy używam poniższego kodu w terminalu SSH dla CentOS, działa dobrze:
paste <(printf "%s\n" "TOP")
Ale jeśli umieszczę ten sam kod wiersza w skrypcie powłoki (test.sh) i uruchomię skrypt powłoki z terminala, zgłasza błąd, ponieważ
./test.sh: line 30: syntax error near unexpected token ('
./test.sh: line 30: paste <(printf "%s\n" "TOP")
Jak mogę rozwiązać ten problem?
dash
Zamiastbash
).#!/bin/sh
na górze. Wykonałem jako,bash test.sh
ale to też nie zadziałało.bash
w trybie POSIX też nie obsługuje tej składni (wywoływanej z--posix
lub as/bin/sh
). Zastosowanie#!/bin/bash
.POSIXLY_CORRECT
zmienną ustawioną podczas uruchamianiabash
?#!/bin/bash
na górze naprawiło problem.Odpowiedzi:
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
. Kiedybash
jest wywoływany z nazwąsh
,bash
przechodzi w tryb posiksowy ( Bash Startup Files - wywoływany z nazwą sh ). W trybie POSIXprocess substitution
nie jest obsługiwany, powoduje błąd składniowy.Skrypt powinien działać, jeśli zadzwonisz
bash
bezpośredniobash test.sh
. Jeśli nie, być możebash
wszedł w tryb posiksowy. Może się to zdarzyć, jeśli zaczynaszbash
od--posix
argumentu lub zmiennaPOSIXLY_CORRECT
jest ustawiona podczasbash
uruchamiania: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:
-
to standardowy sposóbpaste
na odczytanie danych ze standardowego wejścia. W przypadku niektórychpaste
implementacji można to pominąć, choć nie jest to standardowe.Przydałoby się wkleić dane wyjściowe więcej niż jednego polecenia, np .:
W systemach, które obsługują
/dev/fd/n
, można to zrobić zash
pomocą:(to, co
<(...)
robi wewnętrznie).źródło
Oto kolejne obejście. Zamiast uruchomić polecenie, uruchom bash i przekaż polecenie bash, używając -c:
źródło