bash 스크립트는 실패 시 stderr을 인쇄합니다.

bash 스크립트는 실패 시 stderr을 인쇄합니다.

모든 것이 잘되면 bash 스크립트를 자동으로 만들려고 노력하고 있지만 어떤 이유로 충돌하면 모든 stderr 및 디버그 정보를 인쇄합니다. 아래는 내가 지금까지 가지고 있는 것입니다.

#!/usr/bin/bash

set -e

rm -f /tmp/err
trap "sleep 1 && cat /tmp/err" ERR

l() {
    ts >> /tmp/err
}

echo "About to download stuff:" > >(l)
# curl blah blah 2> >(l)

# something goes wrong in the script
invalid_cmd

내가 좋아하지 않는 "Sleep 1"이 있는 경우에만 제대로 작동합니다.

잠들지 말라:

❯ ./demo2.sh    
./demo2.sh: line 18: invalid_cmd: command not found

수면 중:

❯ ./demo2.sh
./demo2.sh: line 18: invalid_cmd: command not found
Feb 25 15:20:44 About to download stuff:

프로세스 교체가 백그라운드에서 실행 중이어서 완료되지 않을 수 있기 때문인 것 같습니다. 또한 wait모든 백그라운드 작업을 맹목적으로 수행하고 싶지 않습니다 . 이 문제를 해결하는 더 좋은 방법이 있습니까?

답변1

좀 더 해킹한 후 다음 해결책을 찾았습니다.

#!/usr/bin/bash

set -e

make_temp_fds() {
    local tfile=$(mktemp)
    exec {fdw}>$tfile {fdr1}<$tfile {fdr2}<$tfile
    rm $tfile
}
    
setup_err_fd() {
    make_temp_fds
    local raw_fdw=$fdw raw_fdr=$fdr1

    make_temp_fds
    local ts_fdw=$fdw ts_fdr=$fdr1

    ts <&$raw_fdr >&$ts_fdw &
    tspid=$!
    trap "wait $tspid && cat <&$ts_fdr" ERR

    err_fd=$raw_fdw
}

# Calling this function, will give you $err_fd
# Anything written to $err_fd will be saved in a temporary file with timestamps 
# and printed out if the script fails with an error. 
# Will be lost if script exits successfully
setup_err_fd

echo "all setup"

echo "debug line 1" >&$err_fd

echo "debug line 2" >&$err_fd

not_ok
#echo "ok"

echo "bye"

불행히도 두 개의 임시 파일이 포함됩니다. 그 중 하나를 파이프라인으로 만들려고 했지만 작동하지 않았습니다. 언제든지 개선하세요

관련 정보