首页 > 解决方案 > zsh:读取直到 EOF 而不是换行

问题描述

如何使用read内置在 zsh 中完成以下代码以收集输出行

ls -l |
{
   read total ; 
   IFS=$'\n' read -dX -A lines  # <-- what should be the delimiter to denote EOF
}

具体来说,ls -l将首先打印total nnn应该读入的行$total。以下所有行应收集到一个数组$lines中。

我应该将什么指定为 EOF(用于代替X)?我的应用程序实际上更复杂。所以请不要建议使用while逐行读取并追加到数组中。

标签: zsh

解决方案


一种方法是使用

ls -l | {
read total;
lines=(${(f)"$(cat)"})
}

解释:

  1. "$(cat)"将剩余的行转换为包含换行符的字符串
  2. ${(f)...}将在换行符处拆分字符串
  3. 最外层(...)创建一个数组

推荐阅读