이를 수행하는 더 좋은 방법이 있습니까?
set -x; ls; set +x
# rest of the script
답변1
표시되는 상황에 대해 다음을 사용할 수 있습니다.
( set -x; ls )
이 set
작업은 서브셸 내의 로컬 환경을 수정하지만 서브셸 외부의 환경은 수정하지 않습니다.
서브쉘은 변수 값 등 상위 환경의 어떤 것도 변경할 수 없습니다.
또한 코드는 xtrace
끝에서 무조건 셸 옵션을 설정 해제하는 반면(즉, 호출 스크립트에서도 해당 옵션을 끕니다 ), 하위 셸을 사용하면(위에 표시된 대로) 활성 여부에 관계없이 처음부터 bash -x
원래 설정을 유지합니다 .set -x
관련된:
답변2
버전 4.4부터 첫 번째 옵션 세트의 옵션( set
옵션 없이 //로 설정된 옵션과 반대되는 옵션 세트)을 로컬 옵션 set -o
으로 그대로 사용할 수 있습니다(현재 활성화된 옵션 세트를 기록하는 특수 인수). 함수로) 따라서 다음과 같은 함수를 정의할 수 있습니다.shopt -o
shopt
-o
local -
$-
xtrace() {
local -
set -o xtrace
"$@"
}
그리고 전화:
xtrace ls
xtrace
이 함수의 컨텍스트 내에서 명령이 호출되므로 예상대로 작동 하지 xtrace return
않습니다 .xtrace typeset var
xtrace shift
PS4
함수에서 로컬로 정의 할 수도 있습니다 .
xtrace() {
local - PS4='xtrace: running '
set -o xtrace
"$@"
}
bash-5.2$ xtrace echo "hello world"
xtrace: running echo 'hello world'
hello world
에 해당하는 구문은 zsh
다음과 같습니다.
xtrace() {
set -o localoptions -o xtrace
local PS4='...'
"$@"
}
답변3
주로 "의 의미에 따라 다릅니다.더 나은 것". 예를 들어 서브쉘을 사용할 수 있습니다.
( set -x; ls )
답변4
( ... )
플래그를 추가하는 대신 명령을 사용하여 -x
새 셸을 호출 할 수도 있습니다 .
bash -x -c 'ls'
이는 현재 환경과 다른 셸을 사용하려는 경우 유용할 수 있습니다.