비슷한 일을 하고 그 이유를 알고 싶을 때;
[ ${debug:=0} -gt 0 ] && set -x || set +x
조건이 set -x
활성화되었는지 여부입니다. 문제는 IF를 먼저 ${debug}
사용할 수 없다는 것입니다 .set +x
debug=1
테스트 사례:
dtest(){ [ "${d:=0}" -gt 0 ] && set -x || set +x; var="abc"; echo "${var}"; }
d=0;dtest
d=1;dtest
d=0;dtest
누군가가 이 질문을 했는지는 확실하지 않으며 아마도 어떤 표현을 사용해야 할지 잘 모르겠습니다.
답변1
함수에서 xtrace를 재설정해야 합니다.
dtest(){
[ "${d:=0}" -gt 0 ] && set -x
var="abc"
echo "${var}"
set +x
}
d=0;dtest
d=1;dtest
d=0;dtest
또는 서브쉘을 사용하십시오:
dtest(){
[ "${d:=0}" -gt 0 ] && set -x || set +x
var="abc"
echo "${var}"
}
d=0;(dtest)
d=1;(dtest)
d=0;(dtest)
답변2
이것은 나에게 잘 작동합니다.
set -x
처음부터 비활성화되어 d=0
설정되지 않습니다.
$ dtest(){ [ "${d:=0}" -gt 0 ] && set -x || set +x; var="abc"; echo "${var}"; }
$ d=0;dtest
abc
여기서는 함수 중간에 설정되어 있으며 마지막 두 명령이 추적에 인쇄됩니다.
$ d=1;dtest
+ var=abc
+ echo abc
abc
여기서는 set -x
기능의 마지막 실행부터 적용되며 기능 중간에 비활성화됩니다. 실행 후 마지막 두 명령에 대한 추적은 인쇄되지 않습니다 set +x
.
$ d=0;dtest
+ d=0
+ dtest
+ '[' 0 -gt 0 ']'
+ set +x
abc
함수 마지막에 무조건 추적을 비활성화하려면 pair 를 추가해야 합니다 set +x
.
또는 변경 사항이 함수 내에서만 적용되도록 하려면 local -
(현재 버전의 Bash에서) $-
변경하기 전에 함수 시작 부분에 값을 수동으로 저장하고 저장된 값을 기반으로 추적 끝을 설정/재설정할 수 있습니다. 값. 서브셸에서 함수를 실행하면 비슷한 효과가 있지만 이 경우 함수 내의 변수에 대한 변경 사항도 함수 외부에서 볼 수 없습니다.