Bash

將 mapfile 函式的一部分重定向到標準輸出,但不重定向到數組

  • May 13, 2021

摘要:就像我們有 Stdout Stderr,我想創建 Stdstatus。標準輸出可以儲存在數組中,標準狀態可以為使用者列印。我不知道 stderr 也可以用於其他消息。但是,為了實現 Stdstatus,有可能嗎?


我有:

SomeFunction(){
 PrintForArray
 echo "Status"
}

mapfile -t SomeArray < <(SomeFunction)

的輸出PrintForArray將儲存在 中SomeArray,但我也想將一些列印Status到命令行。Status不能儲存在數組中!

有什麼建議麼?


筆記:

mapfile將所有標準輸入讀取到一個數組中,因此您不能使用該函式的標準輸出來顯示諸如“狀態”之類的消息。

嘗試這樣的事情:

$ 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不受程序替換的影響,因此在函式中仍然可用,並且仍然引用腳本的原始標準輸出(例如您的 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

引用自:https://unix.stackexchange.com/questions/649497