모든 것이 잘되면 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"
불행히도 두 개의 임시 파일이 포함됩니다. 그 중 하나를 파이프라인으로 만들려고 했지만 작동하지 않았습니다. 언제든지 개선하세요