Ksh

在 ksh 與 bash 中設置 -xv 行為

  • October 16, 2014

通常我喜歡把腳本的所有調試輸出放到一個文件中,所以我會有類似的東西:

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)

引用自:https://unix.stackexchange.com/questions/162311