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