Bash에서 -x
이 옵션을 사용하면 단일 명령의 에코를 생략할 수 있습니까?
출력을 최대한 깔끔하게 유지하려고 노력 중이므로 스크립트의 일부를 하위 쉘에서 실행합니다 set +x
. 그러나 행 set +x
자체는 여전히 에코되며 출력에 중요한 정보를 추가하지 않습니다.
예전에는 .bat
런타임을 사용할 echo on
때 @
. Bash에도 비슷한 것이 있나요?
#!/bin/bash -x
function i_know_what_this_does() {
(
set +x
echo do stuff
)
}
echo the next-next line still echoes 'set +x', is that avoidable?
i_know_what_this_does
echo and we are back and echoing is back on
위 명령을 실행하면 출력은 다음과 같습니다.
+ echo the next-next line still echoes 'set +x,' is that 'avoidable?'
the next-next line still echoes set +x, is that avoidable?
+ i_know_what_this_does
+ set +x
do stuff
+ echo and we are back and echoing is back on
and we are back and echoing is back on
답변1
xtrace
출력은 stderr로 이동하므로 다음 stderr
으로 리디렉션할 수 있습니다 /dev/null
.
i_know_what_this_does() {
echo do stuff
} 2> /dev/null
함수 내에서 실행되는 명령의 오류를 계속 확인하려면 다음을 수행하세요.
i_know_what_this_does() (
{ set +x; } 2> /dev/null # silently disable xtrace
echo do stuff
)
(...)
대신 사용하면 {...}
서브셸을 통해 함수에 로컬 범위가 제공됩니다. bash
버전 4.4는 이제 Almquist 쉘(Almquist 쉘과 유사)에서와 같이 함수에 대한 로컬 옵션으로 옵션 설정을 지원하므로 다음 local -
을 수행하여 하위 쉘 사용을 피할 수 있습니다.set -o localoptions
zsh
i_know_what_this_does() {
{ local -; set +x; } 2> /dev/null # silently disable xtrace
echo do stuff
}
4.0에서 4.3으로의 대안은 bash
변수를 사용하고 $BASH_XTRACEFD
이에 대한 전용 파일 설명자를 여는 것입니다./dev/null
exec 9> /dev/null
set -x
i_know_what_this_does() {
{ local BASH_XTRACEFD=9; } 2> /dev/null # silently disable xtrace
echo do stuff
}
bash
fd를 표시하는 능력이 부족 하기 때문에실행 시 닫기플래그이지만 이는 fd를 다른 명령으로 유출하는 부작용이 있습니다.
이것도 보세요locvar.sh구현될 일부 기능이 포함되어 있습니다.현지의POSIX 스크립트의 변수 및 함수 범위와 이를 생성하기 위한 trace_fn
및 함수 도 제공됩니다 .untrace_fn
길디든 아니든.
답변2
set +x
인쇄하는 이유는 set -x
"실행하려는 명령을 인쇄하고 확장하여달리기 전에. 따라서 쉘은 무언가를 인쇄하지 말라고 지시하는 행을 인쇄할 때까지 사용자가 무언가를 인쇄하지 않기를 원한다는 것을 알지 못합니다. 내가 아는 한, 이런 일이 발생하는 것을 막을 수 있는 방법은 없습니다.
답변3
당신이 찾고 있던 솔루션은 다음과 같습니다.
function xtrace() {
# Print the line as if xtrace was turned on, using perl to filter out
# the extra colon character and the following "set +x" line.
(
set -x
# Colon is a no-op in bash, so nothing will execute.
: "$@"
set +x
) 2>&1 | perl -ne 's/^[+] :/+/ and print' 1>&2
# Execute the original line unmolested
"$@"
}
원래 명령은 ID 변환 시 동일한 셸에서 실행됩니다. 실행하기 전에 매개변수의 비재귀적 xtrace를 얻습니다. 이를 통해 모든 "echo" 명령의 복사본을 stederr에 스팸으로 보내지 않고도 관심 있는 명령을 xtrace할 수 있습니다.
# Example
echo "About to do something complicated ..."
xtrace do_something_complicated