概括:就像我们有 Stdout Stderr 一样,我想创建 Stdstatus。 Stdout 可以存储在数组中,Stdstatus 可以为用户打印。我不知道 stderr 也可以用于其他消息。但是,为了实现Stdstatus,可能吗?
我有:
SomeFunction(){
PrintForArray
echo "Status"
}
mapfile -t SomeArray < <(SomeFunction)
的输出PrintForArray
将存储在 中SomeArray
,但我也想将一些打印Status
到命令行。一定Status
不能存储在数组中!
有什么建议么?
笔记:
这可能有用:“3>&1 1>&2 2>&3”在脚本中起什么作用? - Unix 和 Linux 堆栈交换,但我不知道如何使用它的功能
状态旨在由用户读取。
它可能会或可能不会存储在日志文件中(欢迎这两种建议)。
我不想将其发送到标准错误,因为状态不是错误,我只是希望用户知道发生了什么!
答案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
解释:
首先,脚本将其标准输出复制到
&3
.mapfile
执行时,它从进程替换的标准输出中读取标准输入。&3
是不受影响通过进程替换, so 在函数中仍然可用,并且仍然引用脚本的原始标准输出(例如您的 tty 或脚本输出重定向到的任何位置),而不是重定向。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