2013-09-05 11 views
5

Na Centos 6 maszynie, to działa:Czy sh zastępuje proces zastępowania <(...)?

bash -c 'if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi' 

i to nie:

sh -c 'if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi' 

uzyskać:

sh: -c: line 0: syntax error near unexpected token `(' 
sh: -c: line 0: `if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi' 

Nevermind grep i ogon. Problem polega na tym, że podstawienie procesu jest możliwe: <(...)

Czy ktoś może mi powiedzieć, co sh inaczej tu robi?

[EDIT]

Dzięki za odpowiedzi!

Problem powstał podczas używania capistrano dla wdrożeń. Domyślnie jest to sh, ale zmieniłem to teraz na bash teraz. Powodem, dla którego nie mogłem wykonać normalnej instalacji rurowej, jest to, że gre2 nie wyjdzie natychmiast po zakończeniu meczu, gdy użyjesz tail -F | grep -q --line-buffered. W pliku musi być jeszcze jedna edycja, taka jak echo "" >> catalina.out, co nie było do przyjęcia w mojej sytuacji.

Odpowiedz

5

Składnia <(...) jest obsługiwana tylko przez BASH.

celu uzyskania powłoki POSIX użyciu tego podejścia:

sh -c 'tail -n 1000 -F catalina.out | if grep -qP --line-buffered ".+" ; then ...' 

to przesunąć przekierowanie stdin przed if z rurą. if przejdzie standardowe wejście do grep.

if tail ...| grep nie zadziała ponieważ if nie będzie w stanie zobaczyć to then/fi ponieważ rura rozdziela procesy.

+0

'jeśli ogon ... | grep ...; następnie ... fi' działa dla mnie w desce rozdzielczej i bashie w trybie POSIX. – choroba

+0

@choroba: Tak. Ale czy działa w 'sh' lub' ksh'? –

+0

Działa w ksh. 'sh' na moim systemie to myślnik lub bash w trybie posix. – choroba

3

Należy również zauważyć, że , jeśli Bash is invoked with the name sh, stara się naśladować zachowanie uruchamiania historycznych wersji sh tak ściśle, jak to możliwe, przy jednoczesnym dostosowaniu się do standardu POSIX.

Jeśli twój sh jest linkem do basha, to właśnie to powoduje.

Uruchomienie sh --version; sh -c ': <(echo a)' powinno dać ci wystarczającą ilość informacji.

5

Należy zauważyć, że podstawienie procesu (<(...)) nie jest określone przez POSIX. Więc jeśli biegały bash w trybie POSIX powołując go sh lub mówiąc:

set -o posix 

następnie chcesz obserwować błędy!

Z bash manual:

Zaczynając bash z opcją wiersza polecenia --posix lub wykonujące „set -o posix” podczas Bash jest uruchomiony spowoduje Bash ściślej zgodne ze standardem POSIX, zmieniając zachowanie się pasuje do tego określona przez POSIX w obszarach, w których domyślny Bash różni się.

...

Zmiana procesu nie jest dostępna.