sh -c和进程替换

时间:2016-08-21 21:52:58

标签: bash sh iptables

在终端(bash)中,以下工作正常:

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 个答案:

答案 0 :(得分:2)

sh通常为dash而非bash(请参阅man sh)。 dash没有进行流程替换,只有POSIX的东西。

您需要这样做:

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

ksh&amp; zsh也可以进行流程替换。

通过您的示例,您可以执行以下操作:

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

不需要高级shell或进程子代码。

答案 1 :(得分:0)

语法错误的原因是sh未与您系统上的bash相关联,并且不理解process substitution,这不是POSIX标准的一部分。

我建议使用以下命令,该命令更清晰,适用于任何POSIX兼容shell:

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