`set -x`는 무엇을 하는가?


260

다음 줄이있는 쉘 스크립트가 있습니다.

[ "$DEBUG" == 'true' ] && set -x

15
보세요 :help -m set | less
사이러스

4
help -m set팁 주셔서 감사합니다 . 작동합니다. man set요청하기 전에 시도했지만 우분투에는No manual entry for set
Ole

2
@Ole set은 bash에 내장되어 있으므로 man bashSHELL BUILTIN COMMANDS 섹션에서 찾을 수 있습니다. 맨 페이지를 볼 때이 정규 표현식을 검색하여 맨 페이지로 이동할 수 있습니다 \bset \[.
5910

답변:


364

set -x실행 된 모든 명령이 터미널에 인쇄되는 쉘 모드를 활성화합니다. 귀하의 경우 디버깅에 명확하게 사용됩니다. 이는 일반적인 사용 사례입니다 set -x: 실행될 때마다 모든 명령을 인쇄하면 스크립트가 예상대로 작동하지 않는 경우 제어 흐름을 시각화하는 데 도움이 될 수 있습니다.

set +x 비활성화합니다.


5
해당 기능을 다시 비활성화하는 방법은 무엇입니까?
feedc0de

85
@DanielBrunner : set +x비활성화합니다.
John Zwinck

2
이것은 매우 유용합니다! 나는 누군가가 나에게 그렇게 일찍 말했으면 좋겠다. 스크립팅에 대한 메타 기술을 향상시킬 수있는 다른 흥미로운 트릭이 있습니까?
학생

7
@Student : set -e스크립트 상단에 오류가 발생할 때마다 (명시 적으로 처리되지 않은) 오류와 함께 스크립트가 종료됩니다. 나는 Visual Basic의 악명 높은 것처럼 willy-nilly를 계속 유지하는 것이 기본값보다 엄청나게 선호한다는 것을 알았습니다 On Error Resume Next.
존 즈 빙크

1
불행히도 @JohnZwinck 는 코드 검토가 거의 불가능하다는 점에서 매우 바람직하지 않은 부작용을 set -e가지고 있습니다. (주어진 라인의 동작은 콜 스택의 내용에 달려 있기 때문에-함수가 "체크 된"컨텍스트에서 호출되면 비활성화됩니다. 그 호출과 모든 것을 호출합니다). BashFAQ # 105 의 연습을 참조하십시오 . set -e
Charles Duffy

77

set -x

명령, 대소 문자 명령, 선택 명령에 대한 간단한 명령, 명령 및 인수 또는 연관된 단어 목록이 확장 된 후 실행되기 전에 추적됩니다. PS4 변수의 값이 확장되고 결과 값이 명령 및 확장 된 인수 앞에 인쇄됩니다.

[ 출처 ]

set -x
echo `expr 10 + 20 `
+ expr 10 + 20
+ echo 30
30

set +x
echo `expr 10 + 20 `
30

위의 예는의 사용법을 보여줍니다 set -x. 사용하면 위의 산술 표현이 확장되었습니다. 단일 라인이 어떻게 단계별로 평가되는지 볼 수 있습니다.

  • 첫 번째 단계 expr가 평가되었습니다.
  • 두 번째 단계 echo가 평가되었습니다.

세트에 대한 자세한 내용을 보려면 → 이 링크를 방문 하십시오

쉘 스크립트와 관련하여

[ "$DEBUG" == 'true' ] && set -x

실행 모드가로 선택된 경우 스크립트가 추가 정보 줄을 인쇄했을 수 있습니다 DEBUG. 일반적으로 사람들은 스크립트가 다음과 같은 선택적 인수로 호출 될 때 디버그 모드를 활성화하는 데 사용되었습니다.-d



6

-u : 기본적으로 비활성화되어 있습니다. 활성화되면 구성되지 않은 변수를 사용할 때 오류 메시지가 표시됩니다.

-v : 기본적으로 비활성화되어 있습니다. 활성화 후에는 정보가 출력되기 전에 정보의 원래 내용이 (변수 해상도없이) 표시됩니다.

-x : 기본적으로 비활성화되어 있습니다. 활성화되면 명령 실행 전에 명령 내용이 표시됩니다 (변수 분석 후 ++ 기호가 있음).

다음 차이점을 비교하십시오.

/ # set -v && echo $HOME
/root
/ # set +v && echo $HOME
set +v && echo $HOME
/root

/ # set -x && echo $HOME
+ echo /root
/root
/ # set +x && echo $HOME
+ set +x
/root

/ # set -u && echo $NOSET
/bin/sh: NOSET: parameter not set
/ # set +u && echo $NOSET
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.