bash: "-x" 에코에서 별도의 줄을 이스케이프합니다.

bash: "-x" 에코에서 별도의 줄을 이스케이프합니다.

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 localoptionszsh

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
}

bashfd를 표시하는 능력이 부족 하기 때문에실행 시 닫기플래그이지만 이는 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

관련 정보