Ksh
在 ksh 與 bash 中設置 -xv 行為
通常我喜歡把腳本的所有調試輸出放到一個文件中,所以我會有類似的東西:
exec 2> somefile set -xv
這項工作在 bash 中非常有用,但我注意到在 ksh 中它在函式方面表現不同。我注意到當我在 ksh 中執行此操作時,輸出不顯示函式跟踪,只顯示函式被呼叫。
在進行一些額外的測試時,我注意到行為還取決於函式的聲明方式,如果我使用以下 ksh 語法:
function doSometime {....}
我看到的只是函式呼叫,但是如果使用其他方法聲明函式,例如
doSomething() {....}
跟踪按預期工作。
set -xv
兩種類型的函式聲明是否可以相同地工作?我試過export SHELLOPTS
了,但這也沒有什麼不同。我在 Solaris 11 上使用 ksh93。
從文件中:
由函式 名語法定義並按名稱呼叫的函式與呼叫者在同一程序中執行,並與呼叫者共享所有文件和目前工作目錄。 呼叫者擷取的陷阱將在函式內重置為預設操作。
然而
使用name () 語法定義的函式和使用 . 特殊的內置函式在呼叫者的環境中執行,並與呼叫者共享所有變數和陷阱。
解決方法是不使用
function
關鍵字;堅持函式定義的標準形式。或者,如果您只對幾個函式感興趣,
typeset -tf fname
只需跟踪函式fname
(如果它是用function
關鍵字定義的)。要停止跟踪:
typeset +tf fname
要在 ksh93 中跟踪所有此類函式:
typeset -tf $(typeset +f)
要查看跟踪了哪些函式:
typeset +tf
要停止跟踪所有函式:
typeset +tf $(typeset +tf)