将mapfile函数的一部分重定向到stdout,但不重定向到数组中

将mapfile函数的一部分重定向到stdout,但不重定向到数组中

概括:就像我们有 Stdout Stderr 一样,我想创建 Stdstatus。 Stdout 可以存储在数组中,Stdstatus 可以为用户打印。我不知道 stderr 也可以用于其他消息。但是,为了实现Stdstatus,可能吗?


我有:

SomeFunction(){
  PrintForArray
  echo "Status"
}

mapfile -t SomeArray < <(SomeFunction)

的输出PrintForArray将存储在 中SomeArray,但我也想将一些打印Status到命令行。一定Status不能存储在数组中!

有什么建议么?


笔记:

答案1

mapfile全部stdin 到数组,因此您不能使用函数的 stdout 来显示“状态”等消息。

尝试这样的事情:

$ cat map.sh 
#!/bin/bash

exec 3>&1

SomeFunction(){
  printf "%s\n" {0..3}
  echo "Status" >&3
}

mapfile -t SomeArray < <(SomeFunction)

declare -p SomeArray

解释:

  1. 首先,脚本将其标准输出复制到&3.

  2. mapfile执行时,它从进程替换的标准输出中读取标准输入。

    &3不受影响通过进程替换, so 在函数中仍然可用,并且仍然引用脚本的原始标准输出(例如您的 tty 或脚本输出重定向到的任何位置),而不是重定向。

  3. SomeFunction将其状态消息打印到 &3,而不是打印到(重定向的)stdout。

输出:

$ ./map.sh 
Status
declare -a SomeArray=([0]="0" [1]="1" [2]="2" [3]="3")

顺便说一句,如果你想用“&3”做一些更奇特的事情,而不仅仅是将其打印在标准输出上,你必须有exec声明将其重定向到文件或命名管道或其他东西。

例如,尝试以下任一方法,您会发现无法重定向&3。为时已晚,它已经转到脚本的原始标准输出:

mapfile -t SomeArray < <(SomeFunction) > /dev/null

mapfile -t SomeArray < <(SomeFunction) 3> /dev/null

相关内容