構成ファイルが「クリーンアップ」され、インポートが安全であることを確認する簡単な関数を作成しようとしています。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}"
%
たとえば、return
orexit
ステートメントtrap
をに置き換えると、毎回echo
そのステートメントが実行されていることがわかります。trap
それでは、なぜこの動作はでのみ観察され、ksh
では観察されませんかbash
?根本的な原因は何であり、解決策は何ですか?