2016-08-21 2 views
3

In Terminal (bash) folgendes funktioniert:sh -c und Prozess Substitution

cat <(echo "hello") 

Aber wenn ich tun:

sh -c 'cat <(echo "hello")' 

ich

sh: 1: Syntax error: "(" unexpected 

Können Sie erklären, der Grund warum?

Btw, mein übergeordnetes Ziel ist es, diesen Befehl in einem Shell-Skript zu schreiben:

watch -n 1 'cat <(iptables -L INPUT) <(iptables -L FORWARD)' 

aber es wird nicht funktionieren, scheint der Grund, das oben genannte Problem zu sein.

Antwort

2

sh ist oft dash nicht bash (siehe man sh). dash nicht Prozesssubstitution, nur POSIX Zeug.

Sie werden tun müssen:

bash -c 'cat <(echo "hello")' 

ksh & zsh zu Prozess Substitution tun können.

Mit Ihrem Beispiel, können Sie einfach tun:

watch -n 1 'iptables -L INPUT; iptables -L FORWARD' 

keine Notwendigkeit für eine erweiterte Shell oder Prozess subtitution.

+0

Dank! Ich habe die Antwort von hek2mgl angenommen, weil er zuerst geantwortet hat. – Markus

+1

Danke, aber das ist nicht der richtige Grund. :) Akzeptiere die Antwort, von der du denkst, dass sie für dich am hilfreichsten ist. Bitte überprüfen Sie auch die Antworten, die zu der doppelten Frage gehören. Sie erklären das Problem im Detail. – hek2mgl

+0

@ hek2mgl Danke. Es kann ein guter Grund sein, wenn er denkt, dass unsere Antworten ungefähr gleich gut sind. – PSkocik

0

Der Grund für den Syntaxfehler ist, dass sh nicht mit bash auf Ihrem System verknüpft ist und process substitution nicht versteht, die nicht Teil des POSIX-Standards ist.

würde ich den folgenden Befehl empfehlen, die viel sauberer ist und funktioniert mit jedem POSIX-kompatiblen Shell:

while true ; do 
    clear 
    iptables -L INPUT 
    iptables -L FORWARD 
    sleep 1 
done