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

관련 정보