通常我喜歡將腳本的所有偵錯輸出儲存到一個檔案中,所以我會有類似的內容:
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)