결과:

결과:

오류 트랩에 관해 몇 가지 질문이 있습니다.

  1. 아래 코드는 왜 2개가 아닌 1개의 트랩만 실행합니까? 특히 "mydir1" 대신 "mydir2"가 있는 코드만 실행합니까?
  2. 도대체 왜 트랩을 수행하는 걸까요?
  3. 명령이 태그된 코드로 작성되면 트랩이 전혀 생성되지 않는 이유는 무엇입니까?
  4. 이 코드를 작성하는 가장 좋은/올바른 방법은 무엇입니까?
  5. FuncA 함수의 줄 번호가 아닌 오류 명령의 올바른 줄 번호를 얻는 이유와 방법은 무엇입니까?

    #!/bin/bash
    
    set -o errtrace
    trap 'printerr' ERR
    function printerr(){
     local lc="$BASH_COMMAND" rc=$? ln=${BASH_LINENO[$i]}
     echo "$(date +%s) : Command [ $lc ] exited with code [ $rc ] in line [ $ln ]"
    }
    
    
    function FuncA(){
    
    [[ -d mydir1 ]] && echo mydir1OK
    
    [[ -d mydir2 ]] && echo mydir2OK
    
    #if [ -d /mtdir/ ] ;then
    #       echo OKMYDIR
    #fi
    
    }
    
    FuncA
    

결과:

1457453672 : Command [ [[ -d mydir2 ]] ] exited with code [ 1 ] in line [ 13 ]

답변1

FuncA 함수의 종료 상태가 0이 아니기 때문에 ERR 트랩이 수행된 것으로 보입니다. 에 기록된 대로man bash

함수의 종료 상태는 함수 본문 내에서 실행된 마지막 명령의 종료 상태입니다.

이 경우에는 yes 함수의 마지막 명령으로 a를 추가하여 방지 [[ -d mydir2 ]]할 수 있습니다 .true

(동일한 매뉴얼) 다음과 같은 이유로 구조 if가 다릅니다.

종료 상태는 마지막으로 실행된 명령의 상태이거나, true로 테스트되는 조건이 없으면 0입니다.

if추가보다는 사용을 권장합니다 true.

관련 정보