sh -c 和进程替换

4

在终端(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个回答

3

sh通常使用的是 dash 而不是 bash (参见 man sh)。 dash 不支持进程替换,只支持POSIX标准。

你需要进行以下操作:

  bash -c 'cat <(echo "hello")'
和也可以做进程替换。

以您的示例为例,您可以简单地执行:

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

不需要高级的Shell或进程替换。

1
语法错误的原因是您的系统上未将sh链接到bash,因此无法理解进程替换,这不是POSIX标准的一部分。
我建议使用以下命令,它更加简洁,并且适用于任何符合POSIX的shell:
while true ; do
    clear
    iptables -L INPUT
    iptables -L FORWARD
    sleep 1
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接