bash - 使用重定向为 Herestring 的新行处理输出命令
问题描述
我正在处理一个处理Herestring输入的 while 循环:
one_is_achieved=0
while IFS="=" read key value ; do
process_entry key value && one_is_achieved=1
done <<<$(output_entries)
# Dealing with one_is_achieved
[...]
该函数output_entries()
输出键值行:
k1=some stuff
k2=other stuff
k3=remaining stuff
问题,命令 subtitution $()
捕获 stdout 但用空格替换行尾,导致k1
条目为some stuff k2=other stuff k3= remaining stuff
.
有没有办法防止更换或恢复线的末端?
注意:我以这种方式解决了我的问题:
while IFS="=" read key value ; do
process_entry key value && one_is_achieved=1
done < <(output_entries)
但我认为最初的问题仍然相关(保留或恢复行尾)。
解决方案
这就是在bash
shell中实现命令替换的方式。由于$(..)
shell 进行了默认的分词,未加引号的形式会删除任何嵌入的换行符。默认的 IFS 值是$' \t\n'
,不带引号的扩展会导致基于这 3 个字符中的任何一个进行拆分。
您需要引用替换以防止发生分词。从GNU bash 手册页IFS=""
或通过在展开替换之前设置来重置 IFS 值。
$(command)
command
Bash 通过在子 shell 环境中执行并将命令替换替换为命令的标准输出来执行扩展,并删除任何尾随换行符。嵌入的换行符不会被删除,但它们可能会被删除during word splitting
。
推荐阅读
- python - Wayland 和 Kivy:如何设置窗口位置?
- c# - C# DataGridView 卡在 button1_Click 事件中?
- sql - 根据 Sybase ASE 中的一组其他列值更新查询以增加列值
- java - 我正在尝试以特定方式读取文件,但由于某种原因它返回随机空格
- java - JavaFx 在 Scollpane 中拖动 Shape
- oracle - 尝试使用 .NET Core 执行存储过程时出现“ORA-03115:不支持的网络数据类型或表示”
- loops - 汇编语言 8086 显示 1-10
- haskell - Data.Semigroup 中的 ArgMin 和 ArgMax 类型同义词的用途是什么?
- java - 在锁定任务模式下配对新设备 (Android P/10)
- typescript - 当我像参数一样使用它时,类型路由是什么?