避免仪表板上管道的子外壳

Avoid subshell from pipe on dash

我有这个示例代码:

find "" ! -regex "$regex" 2>/dev/null | while read line ; do
    a="$line"
done

echo ("$a") # prints nothing because of subshell

我需要:

我怎样才能做到这一点?有什么简单的解决方法吗?

使用显式命名管道。

mkfifo named_pipe
find "" ! -regex "$regex" 2> /dev/null > named_pipe &

while read line; do
    a=$line
done < named_pipe

如果我理解正确的话,困扰您的不是子 shell,而是变量在子 shell 之外不保留其值的事实。 您可以像这样使用代码分组:

find "" ! -regex "$regex" 2>/dev/null | 
{ 
  while read line
  do
    a=$line
  done
  echo "$a"
}

你可以使用变量 a 的值,只要它在花括号内。

没有命名管道,也没有 运行 子 shell 中的所有内容,您可以在此处文档中使用 here-doc with a command substitution

while read line; do
    a=$line
done <<EOF
    $(find "" ! -regex "$regex" 2>/dev/null)
EOF

echo "$a"

这应该是便携的。

另见。 BashFAQ/024

注意。 像这样解析 find 的输出是一种反模式。