ksh와 bash에서 -xv 동작 설정

ksh와 bash에서 -xv 동작 설정

일반적으로 나는 스크립트의 모든 디버그 출력을 파일로 이동하는 것을 좋아하므로 다음과 같습니다.

exec 2> somefile
set -xv

이 작업은 bash에서 매우 유용하지만 ksh에서는 기능과 관련하여 다르게 작동한다는 것을 알았습니다. ksh에서 이 작업을 수행했을 때 출력에는 함수 추적이 표시되지 않고 함수가 호출되었다는 것만 표시되었습니다.

몇 가지 추가 테스트를 수행할 때 다음과 같은 ksh 구문을 사용하는 경우 동작이 함수 선언 방법에 따라 달라지는 것을 확인했습니다.

function doSometime {....}

내가 보는 것은 함수 호출뿐입니다. 그러나 다른 방법을 사용하여 함수를 선언하는 경우, 예를 들어

doSomething() {....}

추적이 예상대로 작동합니다. set -xv두 가지 유형의 함수 선언 모두에서 동일한 작업을 수행 할 수 있습니까 ? 나는 시도했지만 export SHELLOPTS아무런 차이가 없었습니다.

저는 Solaris 11에서 ksh93을 사용하고 있습니다.

답변1

문서에서:

다음에 의해 정의된 기능기능 이름구문과 이름으로 호출되는 호출자는 호출자와 동일한 프로세스에서 실행되며 모든 파일을 공유하고 호출자와 작업 디렉터리를 제공합니다. 호출자가 포착한 트랩은 함수 내 기본 동작으로 재설정됩니다.

반면

다음으로 정의된 함수이름() 구문과 로 호출되는 함수 이름 구문으로 정의된 함수입니다. 특수 내장 기능은 호출자의 환경에서 실행되며모든 변수와 트랩을 호출자와 공유합니다.

해결책은 function키워드를 사용하지 않는 것입니다. 함수 정의의 표준 형식을 고수하세요.

또는 몇 가지 함수에만 관심이 있는 경우 는 typeset -tf fname함수를 추적합니다 fname(키워드로 정의된 경우 function).

추적을 중지하려면 다음을 수행하십시오.typeset +tf fname

ksh93에서 이러한 모든 기능을 추적하려면 다음을 수행하십시오.typeset -tf $(typeset +f)

추적되는 함수를 확인하려면 다음을 수행하세요.typeset +tf

모든 기능 추적을 중지하려면:typeset +tf $(typeset +tf)

관련 정보