Zor*_*che 9 scripting bash io-redirection
我想在不创建子 shell 或使用临时文件的情况下遍历命令的输出。
我的脚本的初始版本看起来像这样,但这不起作用,因为它创建了一个子外壳,并且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
Run Code Online (Sandbox Code Playgroud)
因此,建议的替代方法之一是使用这样的命令来避免使用子shell。
while read BLAH ; do echo $BLAH; done </root/regularfile
Run Code Online (Sandbox Code Playgroud)
所以在我看来,我也应该能够使用这样的命令来避免子shell,并且仍然从我想要的程序中获得输出。
while read BLAH ; do echo $BLAH; done <(sysctl -a 2>/dev/null | grep '\.rp_filter')
Run Code Online (Sandbox Code Playgroud)
不幸的是,使用该命令会导致此错误。
-bash: syntax error near unexpected token `<(sysct ...
Run Code Online (Sandbox Code Playgroud)
我真的很困惑,因为这确实有效。
cat <(sysctl -a 2>/dev/null | grep '\.rp_filter')
Run Code Online (Sandbox Code Playgroud)
我可以将该命令的输出保存到一个临时文件,并在临时文件上使用重定向,但我想避免这样做。
那么为什么重定向给我一个错误,除了创建临时文件我还有其他选择吗?
dog*_*ane 14
你错过了一个<
. 应该:
while read BLAH ; do echo $BLAH; done < <(sysctl -a 2>/dev/null | grep '\.rp_filter')
Run Code Online (Sandbox Code Playgroud)
认为<(sysctl -a 2>/dev/null | grep '\.rp_filter')
是一个文件。