이 기사에서는 쉘 스크립트 디버깅 시리즈, 우리는 세 번째 셸 스크립트 디버깅 모드인 셸 추적에 대해 설명하고 작동 방식과 사용 방법을 보여주는 몇 가지 예를 살펴봅니다.
이 시리즈의 이전 부분은 두 가지 다른 셸 스크립트 디버깅 모드에 대해 명확하게 설명합니다. 상세 모드 그리고 구문 검사 이 모드에서 셸 스크립트 디버깅을 활성화하는 방법에 대한 이해하기 쉬운 예가 포함된 모드입니다.
셸 추적은 단순히 셸 스크립트에서 명령 실행을 추적하는 것을 의미합니다. 쉘 추적을 켜려면 다음을 사용하십시오. -NS
디버깅 옵션.
이것은 쉘이 실행될 때 터미널에 모든 명령과 해당 인수를 표시하도록 지시합니다.
우리는 사용할 것입니다 sys_info.sh
시스템 날짜 및 시간, 로그인한 사용자 수 및 시스템 가동 시간을 간략하게 인쇄하는 아래의 셸 스크립트. 그러나 여기에는 찾아서 수정해야 하는 구문 오류가 포함되어 있습니다.
#!/bin/bash. # 간단한 시스템 정보를 인쇄하는 스크립트 ROOT_ID="0" DATE=`date` NO_USERS=`누가 | 화장실 -l` UPTIME=`업타임` check_root(){ if [ "$UID" -ne "$ROOT_ID" ]; then echo "이 프로그램을 실행할 수 없습니다!" 1번 출구; } print_sys_info(){ echo "시스템 시간: $DATE" echo "사용자 수: $NO_USERS" echo "시스템 가동 시간: $UPTIME. } 체크_루트. print_sys_info 종료 0.
파일을 저장하고 스크립트를 실행 가능하게 만드십시오. 스크립트는 루트로만 실행할 수 있으므로 다음을 사용하십시오. sudo 명령 아래와 같이 실행합니다.
$ chmod +x sys_info.sh. $ sudo bash -x sys_info.sh.
위의 출력에서 우리는 출력이 변수 값으로 대체되기 전에 명령이 먼저 실행되었음을 알 수 있습니다.
예를 들어, 데이트 처음 실행되었고 그 출력은 변수의 값으로 대체되었습니다. 데이트.
다음과 같이 구문 오류만 표시하도록 구문 검사를 수행할 수 있습니다.
$ sudo bash -n sys_info.sh
쉘 스크립트를 비판적으로 살펴보면, if 문
마감이 누락되었습니다 파이
단어. 따라서 이를 추가하고 새 스크립트는 이제 아래와 같이 보일 것입니다.
#!/bin/bash. # 간단한 시스템 정보를 인쇄하는 스크립트 ROOT_ID="0" DATE=`date` NO_USERS=`누가 | 화장실 -l` UPTIME=`업타임` check_root(){ if [ "$UID" -ne "$ROOT_ID" ]; then echo "이 프로그램을 실행할 수 없습니다!" 1번 출구; fi } print_sys_info(){ echo "시스템 시간: $DATE" echo "사용자 수: $NO_USERS" echo "시스템 가동 시간: $UPTIME. } 체크_루트. print_sys_info 종료 0.
파일을 다시 저장하고 루트로 호출하고 일부 구문 검사를 수행합니다.
$ sudo bash -n sys_info.sh.
위의 구문 검사 작업의 결과는 여전히 스크립트에 버그가 하나 더 있음을 보여줍니다. 21행. 따라서 아직 구문 수정이 필요합니다.
스크립트를 분석적으로 한 번 더 살펴보면 다음과 같은 오류가 발생합니다. 21행 닫는 큰따옴표가 없기 때문입니다. (”)
마지막으로 에코 명령 안에 print_sys_info
함수.
닫는 큰 따옴표를 추가합니다. 에코 명령을 실행하고 파일을 저장합니다. 변경된 스크립트는 아래와 같습니다.
#!/bin/bash. # 간단한 시스템 정보를 인쇄하는 스크립트 ROOT_ID="0" DATE=`date` NO_USERS=`누가 | 화장실 -l` UPTIME=`업타임` check_root(){ if [ "$UID" -ne "$ROOT_ID" ]; then echo "이 프로그램을 실행할 수 없습니다!" 1번 출구; 파이. } print_sys_info(){ echo "시스템 시간: $DATE" echo "사용자 수: $NO_USERS" echo "시스템 가동 시간: $UPTIME" } 체크_루트. print_sys_info 종료 0.
이제 구문적으로 스크립트를 한 번 더 확인합니다.
$ sudo bash -n sys_info.sh.
스크립트가 이제 구문적으로 정확하기 때문에 위의 명령은 출력을 생성하지 않습니다. 두 번째로 스크립트 실행을 추적할 수도 있으며 잘 작동해야 합니다.
$ sudo bash -x sys_info.sh.
이제 스크립트를 실행합니다.
$ sudo ./sys_info.sh.
셸 스크립트 추적은 구문 오류와 더 중요하게는 논리적 오류를 식별하는 데 도움이 됩니다. 예를 들어 check_root
기능 sys_info.sh
스크립트는 수퍼유저만 실행할 수 있으므로 사용자가 루트인지 여부를 확인하기 위한 셸 스크립트입니다.
check_root(){ if [ "$UID" -ne "$ROOT_ID" ]; then echo "이 프로그램을 실행할 수 없습니다!" 1번 출구; 파이. }
여기의 마법은 if 문
표현 [ "$UID" -ne "$ROOT_ID" ]
, 적절한 수치 연산자를 사용하지 않으면(-네
이 경우 같지 않음을 의미함) 논리적 오류가 발생할 수 있습니다.
사용했다는 가정하에 -eq
( 같음을 의미함), 이는 루트 사용자뿐만 아니라 모든 시스템 사용자가 스크립트를 실행할 수 있도록 허용하므로 논리적 오류가 발생합니다.
check_root(){ if [ "$UID" -eq "$ROOT_ID" ]; then echo "이 프로그램을 실행할 수 없습니다!" 1번 출구; 파이. }
메모: 이 시리즈의 시작 부분에서 이전에 보았듯이 set shell 내장 명령은 쉘 스크립트의 특정 섹션에서 디버깅을 활성화할 수 있습니다.
따라서 아래 줄은 실행을 추적하여 함수에서 이 논리적 오류를 찾는 데 도움이 됩니다.
논리적 오류가 있는 스크립트:
#!/bin/bash. # 간단한 시스템 정보를 인쇄하는 스크립트 ROOT_ID="0" DATE=`date` NO_USERS=`누가 | 화장실 -l` UPTIME=`업타임` check_root(){ if [ "$UID" -eq "$ROOT_ID" ]; then echo "이 프로그램을 실행할 수 없습니다!" 1번 출구; 파이. } print_sys_info(){ echo "시스템 시간: $DATE" echo "사용자 수: $NO_USERS" echo "시스템 가동 시간: $UPTIME" } #check_root 함수의 디버깅을 켜고 끕니다. 설정 -x; 체크 루트; 설정 +x; print_sys_info 종료 0.
파일을 저장하고 스크립트를 호출하면 일반 시스템 사용자가 다음 없이 스크립트를 실행할 수 있음을 알 수 있습니다. 스도 아래 출력과 같이. 의 값 때문입니다. USER_ID ~이다 100 루트와 같지 않은 ROOT_ID 이다 0.
$ ./sys_info.sh.
글쎄요, 지금은 그것으로 끝입니다. 쉘 스크립트 디버깅 시리즈, 아래 응답 양식을 사용하여 이 가이드 또는 전체 3부작 시리즈와 관련된 질문이나 피드백을 처리할 수 있습니다.