Bash
將 mapfile 函式的一部分重定向到標準輸出,但不重定向到數組
摘要:就像我們有 Stdout Stderr,我想創建 Stdstatus。標準輸出可以儲存在數組中,標準狀態可以為使用者列印。我不知道 stderr 也可以用於其他消息。但是,為了實現 Stdstatus,有可能嗎?
我有:
SomeFunction(){ PrintForArray echo "Status" } mapfile -t SomeArray < <(SomeFunction)
的輸出
PrintForArray
將儲存在 中SomeArray
,但我也想將一些列印Status
到命令行。Status
不能儲存在數組中!有什麼建議麼?
筆記:
- 這可能很有用:“3>&1 1>&2 2>&3”在腳本中做了什麼?- Unix & Linux Stack Exchange,但我不知道如何使用它來實現功能
- 狀態是由使用者讀取的。
- 它可能會或可能不會儲存在日誌文件中(歡迎兩種建議)。
- 我不想將它發送到標準錯誤,因為狀態不是錯誤,我只想讓使用者知道發生了什麼!
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
解釋:
- 首先,腳本將其標準輸出複製到
&3
.- 執行時
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