避免仪表板上管道的子外壳
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
我需要:
- subshell 的解决方法使
$a
在外部(在全局范围内)可见
- 不使用 bash 的进程替换
- 与 dash、bash 和 korn shell
兼容
我怎样才能做到这一点?有什么简单的解决方法吗?
使用显式命名管道。
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
的输出是一种反模式。
我有这个示例代码:
find "" ! -regex "$regex" 2>/dev/null | while read line ; do
a="$line"
done
echo ("$a") # prints nothing because of subshell
我需要:
- subshell 的解决方法使
$a
在外部(在全局范围内)可见 - 不使用 bash 的进程替换
- 与 dash、bash 和 korn shell 兼容
我怎样才能做到这一点?有什么简单的解决方法吗?
使用显式命名管道。
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
的输出是一种反模式。