답변1
발견된 토큰과 실제 명령을 실행하는 동안 수행된 작업을 출력하는 셸 구문 스캐너와 파서를 원하는 것 같습니다.
처리 속도가 엄청나게 느려지고 각각의 약간 복잡한 명령에 대해 많은 출력이 생성되기 때문에 이 작업을 수행하는 쉘에 대해서는 잘 모르겠습니다.
bash
정의된 매크로를 사용하여 쉘을 직접 컴파일한 경우 사용DEBUG
그리고itrace()
쉘 소스 코드 1 에서 이 함수에 대한 주석 처리된 호출을 모두 활성화하면 원하는 내용 중 일부를 얻을 수 있습니다.
bash-4.4$ if [[ "$BASHPID" = 10 ]] && [[ "$USER" = myself ]]; then echo hello me; fi
TRACE: pid 22914: parse_matched_pair[9]: open = " close = " flags = 0
TRACE: pid 22914: parse_matched_pair[9]: returning $BASHPID"
TRACE: pid 22914: parse_matched_pair[9]: open = " close = " flags = 0
TRACE: pid 22914: parse_matched_pair[9]: returning $USER"
TRACE: pid 22914: param_expand: `$BASHPID' pflags = 0
여기서는 여는 큰따옴표와 닫는 큰따옴표 및 셸 변수를 찾는 방법에 대한 일부 디버깅 명령문을 출력하는 파서를 볼 수 있습니다. 그 후, 또 다른 처리 단계에서는 수행된 매개변수 확장을 알려주지 $BASHPID
만 모든 단계를 나열하는 것은 아닙니다.
이러한 유형의 디버그 출력은 bash
실제로 셸의 소스 코드를 작성하고 수정하는 데 관련된 사람들에게 더 유용하며, 셸이 입력을 구문 분석하고 해석하는 방식을 이해하는 데에는 확실히 유용합니다.
쉘의 구문과 구문 작동 방식에 더 익숙해지려면 다음으로 시작하는 것이 좋습니다.쉘 구문의 POSIX 정의(이것은 매우 복잡하며 읽을 수 없는 사람들에게는 거의 의미가 없습니다.EBNF).
1문법적 오류가 있는 경우는 제외됩니다 .lib/glob/glob.c
답변2
set -x
바이너리가 아닌 bash 쉘 스크립트에 적용됩니다.
바이너리 실행을 추적하려면 디버거 사용을 고려해야 합니다(예 gdb
: )