ksh93のDEBUGトラップステートメントに終了または戻りステートメントが含まれている場合、最初の実行以降は実行されません。

ksh93のDEBUGトラップステートメントに終了または戻りステートメントが含まれている場合、最初の実行以降は実行されません。

構成ファイルが「クリーンアップ」され、インポートが安全であることを確認する簡単な関数を作成しようとしています。bash関数を初めて呼び出すときにのみ、(バージョンABIJM 93v-2014-06-25)でのみ動作するようです。ksh以下は、まだエラーを再現する関数の縮小バージョンです。

function sanitized_source
{ 
    typeset source_filename=$1
    (
        #shopt -s extdebug # Need this if using bash
        trap 'if [[ $? != 0 ]]; then return 66; fi' DEBUG
        PATH=.
        set -re
        . "${source_filename}"
    )
}

および設定ファイル:

cd /root || echo 'what?'
echo 'why is this executed?'

実行方法と表示される内容:

% . ./dotfile
% sanitized_source test.conf
ksh: sanitized_source[79]: sanitized_source[1]: cd: restricted
% sanitized_source test.conf
ksh: sanitized_source[79]: .[1]: cd: restricted
what?
why is this executed?

その目的は、コマンドが失敗してもシェルが終了しない状況にtrap対処することです。set -eからman bash

[設定]-e

[...] 失敗したコマンドが && または ||内で実行されるコマンドの一部である場合は、最後の&&または||次のコマンドを除いて、シェルは終了しません。

外部デバッグ

[...] 2. DEBUGトラップによって実行されたコマンドがゼロ以外の値を返した場合は、次のコマンドをスキップして実行されません。

最初の呼び出しと2番目の呼び出しの間でパラメータが変更された.sh.commandことを確認しました。.sh.subshell

% sanitized_source test.conf
ksh: sanitized_source[9]: sanitized_source[1]: cd: restricted
% echo "${.sh.command}"
echo 'what?'
% echo "${.sh.subshell}"
0
% sanitized_source test.conf
ksh: sanitized_source[9]: .[1]: cd: restricted
what?
why is this executed?
% echo "${.sh.command}"     
`���2
% echo "${.sh.subshell}"    

%

たとえば、returnorexitステートメントtrapをに置き換えると、毎回echoそのステートメントが実行されていることがわかります。trap

それでは、なぜこの動作はでのみ観察され、kshでは観察されませんかbash?根本的な原因は何であり、解決策は何ですか?

ベストアンサー1

おすすめ記事