首页 > 解决方案 > 流程替换的惯用用法

问题描述

我从 Bash 的手册页中学习了 Bash 进程替换。不幸的是,我对该功能的不熟练使用是丑陋的。

DEV=<(some commands that produce lines of data) && {
    while read -u ${DEV##*/} FIELD1 FIELD2 FIELD3; do
        some commands that consume the fields of a single line of data
    done
}

熟练的程序员还有其他方法可以做到这一点吗?

如果需要可执行示例,请尝试以下操作:

DEV=<(echo -ne "Cincinnati Hamilton Ohio\nAtlanta Fulton Georgia\n") && {
    while read -u ${DEV##*/} FIELD1 FIELD2 FIELD3; do
        echo "$FIELD1 lies in $FIELD2 County, $FIELD3."
    done
}

样本输出:

Cincinnati lies in Hamilton County, Ohio.
Atlanta lies in Fulton County, Georgia.

在我的实际应用中,“一些命令”比较复杂,但上面的示例抓住了问题的本质。

需要进程替换<()。流程替代的替代方案无济于事。

标签: bashprocess-substitution

解决方案


使用 operator 重定向到循环的标准输入<

while read city county state; do
    echo "$city lies in $county County, $state."
done < <(echo -ne "Cincinnati Hamilton Ohio\nAtlanta Fulton Georgia\n")

输出:

Cincinnati lies in Hamilton County, Ohio.
Atlanta lies in Fulton County, Georgia.

请注意,在此示例中,管道也可以正常工作。

echo -ne "Cincinnati Hamilton Ohio\nAtlanta Fulton Georgia\n" |
    while read city county state
do
    echo "$city lies in $county County, $state."
done

此外,应为环境变量(如PATH)和其他特殊变量(如RANDOM)保留大写变量名。描述性变量名称总是好的。


推荐阅读