오류 트랩에 관해 몇 가지 질문이 있습니다.
- 아래 코드는 왜 2개가 아닌 1개의 트랩만 실행합니까? 특히 "mydir1" 대신 "mydir2"가 있는 코드만 실행합니까?
- 도대체 왜 트랩을 수행하는 걸까요?
- 명령이 태그된 코드로 작성되면 트랩이 전혀 생성되지 않는 이유는 무엇입니까?
- 이 코드를 작성하는 가장 좋은/올바른 방법은 무엇입니까?
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
.