일반적으로 스크립트의 모든 디버깅 출력을 파일에 저장하는 것을 좋아하므로 다음과 같습니다.
exec 2> somefile
set -xv
이것은 bash에서는 훌륭하게 작동하지만 ksh에서는 기능 측면에서 다르게 동작한다는 것을 알았습니다. ksh에서 이 작업을 수행하면 출력에 함수 추적이 표시되지 않고 함수가 호출되었다는 것만 표시됩니다.
몇 가지 추가 테스트를 수행하는 동안 다음 ksh 구문을 사용하면 함수가 선언된 방식에 따라 동작이 달라짐을 발견했습니다.
function doSometime {....}
내가 보는 것은 함수 호출뿐이지만, 함수가 다음과 같은 다른 메서드를 사용하여 선언된 경우
doSomething() {....}
추적이 예상대로 작동합니다. 두 가지 유형의 함수 선언이 모두 set -xv
동일한 방식으로 작동합니까? 시도해 보았 export SHELLOPTS
으나 별 차이가 없었습니다.
저는 Solaris 11에서 ksh93을 사용하고 있습니다.
답변1
문서에서:
정의된 함수기능 이름구문과 이름별 호출은 호출자와 동일한 프로세스에서 실행되며 모든 파일과 현재 작업 디렉터리를 호출자와 공유합니다. 호출자가 포착한 트랩은 함수 내의 기본 작업으로 재설정됩니다.
하지만
정의된 함수이름() 함수 이름 구문을 사용하여 정의되고 .special 내장 함수를 사용하여 호출자의 컨텍스트에서 실행되는 구문 및 함수모든 변수와 트랩은 호출자와 공유됩니다.
해결책은 키워드를 사용하지 않고 function
표준 형식의 함수 정의를 고수하는 것입니다.
또는 몇 가지 함수에만 관심이 있는 경우 키워드를 사용하여 정의된 typeset -tf fname
함수를 추적하면 됩니다 .fname
function
추적을 중지하려면:typeset +tf fname
ksh93에서 이러한 모든 기능을 추적하려면 다음을 수행하십시오.typeset -tf $(typeset +f)
추적되는 기능을 확인하려면:typeset +tf
모든 기능 추적을 중지하려면:typeset +tf $(typeset +tf)