mapfile関数の一部をstdoutにリダイレクトしますが、配列にはリダイレクトしません。

mapfile関数の一部をstdoutにリダイレクトしますが、配列にはリダイレクトしません。

一般化する: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スタックの交換しかし、その機能の使い方がわかりません。

  • 状態はユーザーが読むことができるようになっています。

  • ログファイルに保存することも、保存しない場合もあります(両方の提案を歓迎)。

  • 状態がエラーではないので、stderrに送信したくありません。ただユーザーが何が起こっているのかを知りたいです!

ベストアンサー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(リダイレクトされた)stdoutとして印刷するのではなく、ステータスメッセージを&3として印刷します。

出力:

$ ./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

おすすめ記事