stderr에 무언가가 기록되면 실행을 중지합니다.

stderr에 무언가가 기록되면 실행을 중지합니다.

Bash 스크립트에서 오류를 처리하는 데 문제가 있습니다. 지금까지 bash에서 본 오류 처리 솔루션 중 어느 것도 이 예제 스크립트에서 작동하지 않는 것 같습니다.

#!/usr/bin/env bash
set -euo pipefail

eval $(do_stuff)
touch file

출력은 다음과 같습니다

./script.sh: line 4: do_stuff: command not found

하지만 그럼에도 불구하고 행복하게 계속해서 파일을 생성하는데, 이것이 제가 비활성화하고 싶은 것입니다. 나는 stderr를 다른 프로그램으로 파이프하고 출력을 얻는 동안 전체 프로그램을 종료할 수 있다고 생각했습니다.

unbuffer ./script.sh 2>&1|{ while read stdin; do echo $stdin;killall -9 bash;done; }

그러나 이는 약 5%의 시간에만 작동합니다. 대부분의 경우 스크립트를 조기에 종료하지 못합니다.

답변1

내가 게시한 사건을 우아하게 처리하는 방법을 알아냈습니다.

eval() {
    if [[ -z "${@}" ]];then
        exit 1
    fi
    builtin eval "$@"
}

기본 eval() 구현을 재정의하고 입력이 수신되지 않으면 종료됩니다. 하지만 이 답변은 여전히 ​​질문 제목에 대한 답변이 아니기 때문에 수락하지 않습니다.

답변2

먼저 과제로 변경한 다음 평가하세요.

예 1(입력 명령이 유효하지 않은 경우 중지):

[xiaobai@localhost ~]$ cat h2.sh
#!/bin/bash

trap err_handler ERR
err_handler() { echo trapped ; exit; }
e2=$(echoasasas)
eval "$e2"
echo "next"
[xiaobai@localhost ~]$ sh h2.sh
h2.sh: line 5: echoasasas: command not found
trapped
[xiaobai@localhost ~]$ 

예 2(출력이 유효한 명령이 아닌 경우 중지):

[xiaobai@localhost ~]$ cat h2.sh
#!/bin/bash

trap err_handler ERR
err_handler() { echo trapped ; exit; }
e2=$(echo xxxxx)
eval "$e2"
echo "next"
[xiaobai@localhost ~]$ sh h2.sh
h2.sh: line 6: xxxxx: command not found
trapped
[xiaobai@localhost ~]$ 

예제 3(다음 명령 계속 실행):

[xiaobai@localhost ~]$ cat h2.sh
#!/bin/bash

trap err_handler ERR
err_handler() { echo trapped ; exit; }
e2=$(echo ls)
eval "$e2"
echo "next"
[xiaobai@localhost ~]$ sh h2.sh
Android  CRITICAL  Documents
next
[xiaobai@localhost ~]$ 

예제 4(STDERR이 다른 쉘에서 실행되는 경우 절반):

[xiaobai@localhost ~]$ cat /tmp/so.sh 
ls yyyyyy 2>/tmp/kas
[xiaobai@localhost ~]$ cat /tmp/kas
[xiaobai@localhost ~]$ cat h2.sh
#!/bin/bash

trap err_handler ERR
err_handler() { echo trapped ; exit; }
echo "before"
e2=$(/bin/bash /tmp/so.sh)
eval "$e2"
echo "next"
[xiaobai@localhost ~]$ sh h2.sh
before
trapped
[xiaobai@localhost ~]$ cat /tmp/kas
ls: cannot access 'yyyyyy': No such file or directory
[xiaobai@localhost ~]$ 

관련 정보