나는 비슷한 것을 하고 싶다:
command || log $error_from_last_command
파이프처럼 사용 ||
하면서도 계속 액세스할 수 있는 방법이 있나요?stderr
command
내 의도는 의 오류 메시지를 처리하는 것이지만 log
, 실패하는 경우에만 해당됩니다 command
. 표시된 사본을 읽고 있지만 내 사례에 어떻게 적용해야 할지 모르겠습니다.
답변1
첫 번째 명령이 완료된 후에만 실행되는 다른 프로그램에서 프로그램의 출력을 사용하려는 경우 출력을 파일에 저장하는 것이 아마도 가장 쉬운 방법일 것입니다.
errfile=$(mktemp)
if ! somecommand 2> "$errfile" ; then
log < "$errfile" # or log "$(cat "$errfile")" ?
fi
rm "$errfile"
출력을 파이프하려면 명령을 동시에 실행해야 하지만 첫 번째 명령이 완료될 때만 종료 코드를 얻습니다.
log < "$errfile"
물론 위의 내용은 오류 메시지를 표준 입력으로 전달합니다 log
(파이프를 사용하는 것과 마찬가지로). 명령줄 인수로 전달하려면 log "$(cat "$errfile")"
(하나의 인수) 또는 log $(cat "$errfile")
(분사 사용, log
여러 인수 참조) 또는 log "$(< "$errfile")"
(비표준, 최소한 Bash에서 작동함)을 사용하십시오.
답변2
다음 사항을 아는 것만으로도 귀하의 목적에 충분하다면종료 코드bash
파이프의 첫 번째 요소(또는 파이프의 모든 요소)에서 이 변수 를 사용할 수 있습니다 . 매뉴얼 페이지 PIPESTATUS
에 따르면 이 변수는 bash
"배열 변수... 프로세스의 종료 상태 값 목록을 포함합니다. 가장 최근에 실행된 프런트엔드 파이프라인...".
기술적으로는 약간 다른 것을 요구하고 있다는 것을 알고 있지만 이 변수를 사용하면 처음에 예상하지 못한 방식으로 요구 사항을 충족할 수 있는지 고려해 볼 수 있습니다.