sh -c 和进程替换

sh -c and process substitution

在终端 (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)'

但是不行,原因好像是上面的问题

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

您需要做:

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

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

根据你的例子,你可以简单地做:

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

无需高级 shell 或流程替换。

语法错误的原因是 sh 在您的系统上没有链接到 bash 并且不理解 process substitution,它不是 [=18= 的一部分]标准。

我会推荐以下命令,它更简洁并且适用于任何 POSIX 兼容 shell:

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