2016-08-21 46 views
3

在终端(bash)的下列工作正常:SH -c和进程替换

cat <(echo "hello") 

但是,如果我做的:

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

我得到

sh: 1: Syntax error: "(" unexpected 

你能解释一下之所以?

顺便说一句,我的总体目标是在shell脚本写这个命令:

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

,但它不会工作,原因似乎是上述问题。

回答

2

sh通常是dash而不是bash(参见man sh)。 dash不做进程替换,只有POSIX的东西。

你需要做的事:

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

ksh & zsh能做的进程替换了。

你的榜样,你可以简单地做:

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

不需要先进的壳或过程托换。

+0

谢谢!我接受了hek2mgl的回答,因为他先回答了。 – Markus

+1

谢谢,但这不是正确的原因。 :)接受你认为对你最有帮助的答案。请检查属于重复问题的答案。他们更详细地解释了这个问题。 – hek2mgl

+0

@ hek2mgl谢谢。如果他认为我们的答案同样好,这可能是一个很好的理由。 – PSkocik

0

语法错误的原因是sh未链接到系统上的bash,并且不理解process substitution,它不属于POSIX标准的一部分。

我建议下面的命令是更清洁,与任何兼容POSIX外壳作品:

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