"set -x"를 사용하여 주석 추가

"set -x"를 사용하여 주석 추가

때로는 추가하는 것이 정말 편리합니다.

set -x

실행 전에 모든 명령을 표시하려면 스크립트 상단으로 이동하세요.

좋은 출력을 가진 스크립트를 만드는 데에는 단 한 가지 단점이 있습니다. 이런 식으로 스크립트에 텍스트 출력을 추가하는 방법을 모르겠습니다. 내가 사용한다면

echo 'some comment'

이렇게 하면 인쇄가 두 배가 됩니다.

+ echo 'some comment'
some comment

사용해보면 #전혀 나오지 않습니다.

와 같이 인쇄되는 주석을 추가하는 방법은 무엇입니까 echo? 을 사용하면 어떻게 되나요 set -x?

답변1

영리한 접근 방식은 주석을 no-op 명령에 대한 인수로 작성하는 것입니다. 특히 유용할 수 있는 사항은 다음과 같습니다.:빈 유틸리티:

set -x
: Some interesting notes on the following are ...

결과 :

+ : Some interesting notes on the following are...

콜론 명령은 아무 작업도 수행하지 않고 사용자가 제공하는 모든 인수를 허용하며 항상 성공합니다. :추적 출력 시작 부분에서 추가 정보를 얻을 수 있지만 이는 아마도 사용자의 목적에 있어서 큰 문제는 아닐 것입니다 .

이것이 마음에 들지 않으면 :더 나쁜 방법은 가짜 명령을 사용하는 것입니다.

set -x
seq 1 1
Some comment &>/dev/null
true

다음을 출력합니다:

+ seq 1 1
1
+ Some comment
+ true

즉, Some comment쉘이 라인을 실행하려고 하면 라인이 추적 출력으로 인쇄되지만 결과 오류 메시지는 로 전송됩니다 /dev/null. 이는 여러 가지 명백한 이유로 짜증나는 일이지만 . 오류 set -e.


두 경우 모두 귀하의 주석은 일반적인 방법으로 쉘에 의해 구문 분석되므로 특히 특수 문자가 있는 경우 이를 인용해야 하며 추적 출력이므로 인용문이 표시됩니다.

답변2

디버깅 정보를 인쇄하려면 "set -x"를 사용하지 말고 대신 별도의 디버깅 기능을 사용하세요.

#!/bin/bash

DEBUG=1

debug() {
    if [ $DEBUG == 1 ]
    then
    echo "DEBUG:" $@
    fi
}

debug "foo bar"

스크립트를 실행하면 다음이 생성됩니다.

temeraire:ul jenny$ ./testdebug.sh 
DEBUG: foo bar

할당을 read 로 변경하면 DEBUG=0해당 행이 인쇄되지 않습니다.

답변3

스크립트를 디버깅하는 데 사용 했는데 set -x해결책만 찾았습니다.@MichaelHomer가 제안했습니다.그것은 이점을 취한다빈 유틸리티(일명. : ..some comment...).

보다 효율적인 솔루션으로 이동할 준비가 되면 실제 로거를 사용하여 스크립트를 구현하는 것이 좋습니다.log4Bash.

#!/usr/bin/env bash
source log4bash.sh

log "This is regular log message... log and log_info do the same thing";

log_warning "Luke ... you turned off your targeting computer";
log_info "I have you now!";
log_success "You're all clear kid, now let's blow this thing and go home.";
log_error "One thing's for sure, we're all gonna be a lot thinner.";

# If you have figlet installed -- you'll see some big letters on the screen!
log_captains "What was in the captain's toilet?";

# If you have the "say" command (e.g. on a Mac)
log_speak "Resistance is futile";

결과:

   SS #1

답변4

:아무 작업도 수행하지 않는 null 명령을 사용할 수 있습니다 .

: ::::::: your comment here

참고: 주석에 bash 특수 문자를 사용하지 마십시오. 그렇지 않으면 (, $, !, [, ...여전히 해석됩니다.

더 읽기 쉽게 만들려면 +settings 를 통해 원하는 문자열로 변경할 수 있습니다 PS4. 예를 들면 다음과 같습니다.

PS4=": "; set -x

관련 정보