通常、スクリプトのすべてのデバッグ出力をファイルに保存するのが好きなので、次のようになります。
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)