$(...|...) 명령의 PIPESTATUS

$(...|...) 명령의 PIPESTATUS

현재 쉘에 변수가 설정된 경우 명령을 읽는 방법은 무엇입니까 ${PIPESTATUS[0]? 어떻게든 이것을 현재 쉘에 전달할 수 있는 방법이 있습니까?

변수를 설정 중인데 메일 속성이 실제로 LDAP에 존재하지 않는다고 결정하기 전에 변수가 실패하지 않는지 확인 MAIL=$(ldapsearch.... | find_for_mail)하고 싶습니다 .ldapsearch

$ true | false
$ echo ${PIPESTATUS[0]} ${PIPESTATUS[1]}
0 1
$ Z=$(true | false)
$ echo ${PIPESTATUS[0]}
1                        <--- why 1?
$ echo ${PIPESTATUS[1]}

$ Z=$(true | false;echo ${PIPESTATUS[0]} ${PIPESTATUS[1]})
$ echo $Z
0 1
$ Z=$(true | false;C="${PIPESTATUS[0]} ${PIPESTATUS[1]}")
$ echo $C

$ Z=$(true | false;export C="${PIPESTATUS[0]} ${PIPESTATUS[1]}")
$ echo $C

답변1

문제는 export변수를 상위 프로세스에서 하위 프로세스로 환경 변수로 내보내는 것이지 그 반대는 아닙니다. 종료 코드 중 하나만 관심이 있는 경우 다음 코드를 사용할 수 있습니다.

$ Z=$(false | true; exit ${PIPESTATUS[0]})
$ echo $?
1

답변2

Linux에서 이를 수행하는 한 가지 방법은 임시 파일을 사용하여 데이터를 전달하는 것입니다( <<<임시 파일을 사용함).

{
  output=$(cmd1 | cmd2 | cmd3; printf '%s\n' "${PIPESTATUS[@]}" > /dev/fd/3)
  readarray -t cmdsubst_pipe_status <&3
} 3<<< ''
printf '%s\n' "cmd1's status: ${cmdsubst_pipe_status[0]}"

관련 정보