함수에 대한 디버그 메시지

함수에 대한 디버그 메시지

디버깅 중에만 메시지를 표시하는 함수가 필요합니다(함수 이름).

#!/bin/bash

debug_function(){
  if [[ $DEBUG -eq 1 ]]; then
    echo "${FUNCNAME[1]}"
  else
    DEBUG=0
  fi
}

test_function(){
 debug_function
 echo "something"
}

foo=$(test_function)

echo "Result: $foo"

작동하지만 DEBUG=1을 사용하면 함수 이름이 함수 출력에 분명히 추가됩니다.

# sh test
Result: something

# DEBUG=1 sh test
Result: test_function
something

메시지만 인쇄하는 방법이 있나요?

이것을 사용하면 wall올바른 동작을 얻을 수 있지만 다른 옵션이 있습니까?

감사해요

답변1

stdout으로 인쇄 하므로 echo "${FUNCNAME[1]}"해당 출력은 의 출력에 속하고 debug_function, 이는 다시 의 출력에 속합니다 test_function.

메시지를 stderr로 인쇄합니다:

  • 출력을 리디렉션하여 다음을 수행합니다 echo.

    echo "${FUNCNAME[1]}" >&2
    
  • 또는 호출 시 전체 출력을 리디렉션합니다 debug_function(전체 함수가 stderr로 인쇄되어야 하는 경우) debug_function.

    debug_function >&2
    

후자의 방법을 사용하면 내부 명령을 debug_function표준 출력으로 직접 인쇄할 수 있습니다. stdout debug_function이 리디렉션되기 때문에 인쇄하는 내용이 리디렉션됩니다 .

함수 자체는 stdout을 stderr로 리디렉션할 수 있습니다 exec >&2. 이는 해당 기능 내의 모든 명령에 영향을 미칩니다. 그러나 이는 리디렉션된 함수가 하위 쉘에서 실행되지 않는 한 호출 함수/스크립트에도 영향을 미칩니다.

필요한 경우 하위 쉘에서 이 기능을 실행할 수 있습니다 (debug_function). 항상 서브셸에서 함수를 실행하려면 ()함수를 정의할 때 대신 사용하세요.{}

따라서 stdout 대신 stderr로 인쇄하는 것이 전체 목적인 함수는 다음과 같이 정의할 수 있습니다.

debug_function()(
   exec >&2
   echo whatever
   # ...
)

이제 echo함수의 다른 명령은 필요하지 않습니다 >&2. 단순히 함수를 호출하더라도 debug_function그 안에 있는 명령은 stderr에 인쇄됩니다.

참고: 하나의 서브셸이나 명령의 stdout 또는 stderr은 다른 서브셸이나 명령 또는 전체 스크립트의 stdout 또는 stderr과 다를 수 있습니다. 리디렉션은 다양한 수준에서 구현될 수 있습니다. 따라서 자체 하위 쉘에서 실행되는 함수라도 함수 본문 외부에서 "올바른" 리디렉션이 발생하면 exec >&2전체 스크립트의 stdout에 쓸 수 있습니다 . 자세한 내용은 다루지 않겠습니다.

기억해야 할 가장 중요한 사항은 다음과 같습니다.

표준 출력은 일반적으로 (귀하의 경우와 같이) 캡처되거나 추가로 파이프됩니다. stderr의 요점은오류/디버그/진단 메시지가 표준 출력을 오염시키지 않도록 하세요..

관련 정보