我想遍历命令的输出而不创建子外壳或使用临时文件。
我的脚本的初始版本看起来像这样,但这不起作用,因为它创建了一个子外壳,并且该exit
命令终止了该子外壳,而不是所需的主脚本。它是配置策略路由的更大脚本的一部分,如果它检测到会导致路由失败的条件,则将暂停执行。
sysctl -a 2>/dev/null | grep '\.rp_filter' | while read -r -a RPSTAT ; do
if [[ "0" != "${RPSTAT[2]}" ]] ; then
echo >&2 "RP Filter must be disabled on all interfaces!"
echo >&2 "The RP filter feature is incompatible with policy routing"
exit 1
fi
done
因此,建议的替代方法之一是使用类似这样的命令来避免子外壳。
while read BLAH ; do echo $BLAH; done </root/regularfile
所以在我看来,我也应该可以使用这样的命令来避免子shell并仍然从我想要的程序中获取输出。
while read BLAH ; do echo $BLAH; done <(sysctl -a 2>/dev/null | grep '\.rp_filter')
不幸的是,使用该命令会导致此错误。
-bash: syntax error near unexpected token `<(sysct ...
我真的很困惑,因为这行得通。
cat <(sysctl -a 2>/dev/null | grep '\.rp_filter')
我可以将该命令的输出保存到一个临时文件中,并使用重定向该临时文件,但是我想避免这样做。
那么,为什么重定向给我一个错误,除了创建临时文件之外,我还有其他选择吗?
fvue.nl/wiki/... tldp.org/LDP/abs/html/subshells.html
—
Zoredache