STDOUT을 변수에 할당할 때 쉘 스크립트 오류 처리

STDOUT을 변수에 할당할 때 쉘 스크립트 오류 처리

두 번째 답변에서 언급한 대로 쉘 스크립트에서 오류 처리를 구현하려고 합니다.$? 사용에 대한 모범 사례 배쉬에서?

내 스크립트는 다음과 같습니다

#!/bin/bash

try() {
    "$@"
    code=$?
    if [ $code -ne 0 ]
    then
        echo "oops $1 didn't work"
        exit 1
    fi
}

try myvar=$(mktemp -p ./)

스크립트는 다음과 같이 종료됩니다.

./test.sh: line 4: myvar=./tmp.scNLzO1DDi: No such file or directory
oops myvar=./tmp.scNLzO1DDi didn't work

오직,

myvar=$(mktemp -p ./)

물론 잘 작동합니다. $myvar는 임시 파일의 전체 경로와 이름을 반환합니다.

try()가 원하는 작업을 수행할 수 있도록 전체 명령문과 그 결과를 try()에 전달하면서 tmp 파일의 이름을 변수 myvar에 할당하는 명령문을 어떻게 얻을 수 있습니까? 감사해요.

답변1

사용되면 인수 목록을 생성하는 동안 호출이 이루어지기 전에 try myvar=$(mktemp -p ./)with 서브쉘이 실행됩니다.mktmptrytry

나중에 서브셸을 확장하려면 다음 매개변수를 인용해야 합니다 try.

try 'myvar=$(mktemp -p ./)'

나중에 확장하려면 첫 번째 줄 eval "$@"대신 을 사용해야 합니다 ."$@"try

답변2

평가된 래퍼 대신 오류 트랩을 사용하고 싶다고 생각합니다.

err_handler () {
    code=$?
    if [ $code -ne 0 ]
    then
        echo "oops $1 didn't work"
        exit 1
    fi
}

trap 'err_handler' ERR
myvar=$(mktemp -p ./)
trap ERR

관련 정보