일반화하다: 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
설명하다:
먼저 스크립트는 표준 출력을
&3
.mapfile
실행되면 프로세스의 대체된 표준 출력에서 표준 입력을 읽습니다.&3
예영향을받지 않았다프로세스 대체를 사용하면 함수에서 so를 계속 사용할 수 있으며 스크립트의 원래 표준 출력(예: tty 또는 스크립트 출력이 리디렉션되는 위치)은 리디렉션되지 않고 계속 참조됩니다.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