在没有子shell的情况下迭代bash中命令的输出

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')是一个文件。

  • 谷歌“进程替换”。例如 http://www.tldp.org/LDP/abs/html/abs-guide.html#PROCESS-SUB (2认同)