디버깅 중에만 메시지를 표시하는 함수가 필요합니다(함수 이름).
#!/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의 요점은오류/디버그/진단 메시지가 표준 출력을 오염시키지 않도록 하세요..