bash - 流程替换的惯用用法
问题描述
我从 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.
在我的实际应用中,“一些命令”比较复杂,但上面的示例抓住了问题的本质。
需要进程替换<()
。流程替代的替代方案无济于事。
解决方案
使用 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
)保留大写变量名。描述性变量名称总是好的。
推荐阅读
- java - 忽略 JSON 反序列化的默认字段值
- c# - 如何使对象统一随机生成?
- python - SQLAlchemy 查询,其中比较多列的元组
- linux - 由于堆大小有限,realloc 函数给出了 SIGABRT
- image - 在带有堆栈的容器外稍微颤动位置图像
- python - Django / DRF - 尝试在序列化程序“TestTakerSerializer”上获取字段“users_answers_set”的值时出现 AttributeError
- kibana - 弹性 - Grok 模式错误地解析字符串字段
- fluentd - Fluentd 消息解析以发送到多个目的地
- php - 流明:具有默认值的新记录已添加到数据库
- c# - 无法在 Listview 虚拟模式中获得我的价值