서브셸에서 추적(set -x)

서브셸에서 추적(set -x)

기본 제공 표현식은 set -x추적을 활성화하여 와일드카드 뒤, 실행 전에 각 명령을 인쇄합니다. 제가 궁금한 점은 set -x다양한 상황에서 제공되는 출력의 차이입니다.

달리다 bash -c 'set -x; echo "hello"'보면 보이는데...

+ echo hello
hello

달리다 bash -c '(set -x; echo "hello")'보면 보이는데...

+ echo hello
hello

달리다 bash -c 'hi=$(set -x; echo "hello")'보면 보이는데...

++ echo hello

+마지막 사례에 왜 이중이 있는지 아는 사람이 있나요?

답변1

인용하다배쉬 매뉴얼을 위한 set -x:

확장 후 및 실행 전의 인수 또는 관련 단어 목록과 함께 간단한 명령, for명령, case명령 , 명령 및 산술 명령의 추적을 인쇄합니다. select변수 for의 값이 PS4확장되고 결과 값이 명령 및 확장된 인수 앞에 인쇄됩니다.

PS4~로 서술 된:

이 매개변수의 값은 다음과 같이 확장됩니다.PS1-x확장된 값은 옵션이 설정될 때 명령줄을 에코하기 전에 인쇄되는 프롬프트입니다(참조:내장 컬렉션). 확장된 값의 첫 번째 문자는 여러 수준의 간접 참조를 나타내기 위해 필요한 만큼 복사됩니다. 기본값은 " +"입니다.

반복되는 +기호는 간접 참조 수준을 나타냅니다.

  • set -x; echo "hello"단일 수준에서 작동합니다.
  • hi=$(set -x; echo "hello")2개로 실행: 교체에 사용되는 서브셸 환경은 두 번째 수준입니다.

set -x간접 참조 수준은 명령이 실행되는 수준에서 계산 되지 않으며 "기본" 셸에서 계산됩니다.

이 문자 복제는 Bash에만 적용됩니다. 다른 쉘에서는 이러한 방식으로 쉘 깊이를 표시하지 않습니다.

관련 정보