programing

인쇄되지 않은 배시 세트 +x

showcode 2023. 5. 5. 10:01
반응형

인쇄되지 않은 배시 세트 +x

우리가 할 수 있는 말이set +x인쇄되지 않은 상태에서 bash:

set -x
command
set +x

흔적

+ command
+ set +x

하지만 인쇄만 하면 됩니다.

+ command

Bash는 버전 4.1.10(4)입니다.이것은 지금 한동안 나를 괴롭히고 있습니다. 출력이 쓸모없이 어수선합니다.set +x추적 기능을 가능한 한 유용하지 않게 만드는 선.

저도 같은 문제가 있었고, 하위 셸을 사용하지 않는 솔루션을 찾을 수 있었습니다.

set -x
command
{ set +x; } 2>/dev/null

하위 셸을 사용할 수 있습니다.하위 셸을 종료할 때 다음과 같이 설정합니다.x손실됨:

( set -x ; command )

저는 최근에 이것에 대해 짜증이 났을 때 해결책을 찾았습니다.

shopt -s expand_aliases
_xtrace() {
    case $1 in
        on) set -x ;;
        off) set +x ;;
    esac
}
alias xtrace='{ _xtrace $(cat); } 2>/dev/null <<<'

이렇게 하면 다음과 같이 추가 추적을 활성화 및 비활성화할 수 있습니다. 여기서 변수에 인수가 할당되는 방식을 기록합니다.

xtrace on
ARG1=$1
ARG2=$2
xtrace off

그리고 다음과 같은 출력을 얻을 수 있습니다.

$ ./script.sh one two
+ ARG1=one
+ ARG2=two

@user108471의 단순화된 버전을 기반으로 한 솔루션은 어떻습니까?

shopt -s expand_aliases
alias trace_on='set -x'
alias trace_off='{ set +x; } 2>/dev/null'

trace_on
...stuff...
trace_off

이것은 코드 블록을 포함하고 종료 상태를 유지할 수 있는 몇 가지 아이디어의 조합입니다.

#!/bin/bash
shopt -s expand_aliases
alias trace_on='set -x'
alias trace_off='{ PREV_STATUS=$? ; set +x; } 2>/dev/null; (exit $PREV_STATUS)'

trace_on
echo hello
trace_off
echo "status: $?"

trace_on
(exit 56)
trace_off
echo "status: $?"

실행 시:

$ ./test.sh 
+ echo hello
hello
status: 0
+ exit 56
status: 56

여기 또 하나 있습니다.스크립트에서 특정 명령만 추적하려는 경우가 많습니다.그렇다면 그렇게 하는 함수를 작성하는 것은 어떨까요?

> call() { set -x; "$@"; { set +x; } 2>/dev/null; }
> call uname -a
+ uname -a
CYGWIN_NT-6.1-WOW W530 3.1.7(0.340/5/3) 2020-08-22 19:03 i686 Cygwin
> call make -j8 *.mak
+ make -j8 some_name.mak

호출된 명령의 종료 코드를 반환(및 추적)하여 이를 더욱 개선할 수 있습니다.

> call() { local rc; set -x; "$@"; rc=$?; { set +x; } 2>/dev/null; return $rc; }
> call true && echo yes
+ true
+ rc=0
yes
> call false && echo yes
+ false
+ rc=1

다음은 Rhapsody CLI 프로그램을 호출하여 명령줄 옵션이 있는 .rcl 파일에서 소스 코드를 생성하는 실제 예제입니다.

die() {
    local c=${1:--1} m=${2:-'Died'}
    echo "$m at ${BASH_SOURCE[1]}:${FUNCNAME[1]} line ${BASH_LINENO[0]} (exit $c)" >&2
    exit $c
}
call() { local rc; set -x; "$@"; rc=$?; { set +x; } 2>/dev/null; return $rc; }

call "$opt_rhapsodycl" -f $rclfile || die $? 'Rhapsody license server not reachable'

예를 들어, 오류가 발생한 경우 다음과 같은 것이 인쇄됩니다.

 + path/to/RhapsodyCL.exe -f configuration.rcl
 + rc=127
 Rhapsody license server not reachable at ./Build:main line 167 (exit 127)

또는 성공한 경우 스크립트가 계속 진행됩니다.이 두 가지 기능을 사용하면)call그리고.die) 우리는 매우 작고 읽기 쉬운 한 줄기를 작성할 수 있으며 훌륭한 추적 출력도 생성할 수 있습니다.

질문과 다소 관련이 있는 것은 스크립트 명령이 수행하는 높은 수준의 작업에 대한 설명을 제공하기 위해 추적된 출력에도 (논리적인) 주석을 표시하는 방법입니다.

제가 보통 하는 방법은 최소한의 오버헤드를 신경 쓰지 않으신다면 다음과 같습니다.

어떤_스크립트

#!/usr/bin/env bash
set -x
...
: This shows a directory listing
ls
...

샘플 출력

+ : This shows a directory listing
+ ls
test.sh

물론 매개 변수를 단일 따옴표 또는 이중 따옴표(또는 따옴표 없음)와 함께 기본 제공되는 에 묶을 수도 있습니다. 이 경우 출력 중에 변수 확장(및 기타 부작용)이 발생할 수 있다는 장점이 있습니다.

그런 다음 이 메서드를 추적 전용 인라인 상세 메시지 도구로 사용하여 일반 추적 출력 내에 디버그 추적 메시지를 추가로 삽입할 수 있습니다. 이 메시지는 추적이 비활성화되면 출력되지 않습니다.

언급URL : https://stackoverflow.com/questions/13195655/bash-set-x-without-it-being-printed

반응형