私は一日中私をブロックしている大きな問題を抱えています.
用途に基づいたさまざまな機能を備えた多数の機能ファイルがあります。SSH、ロギングなど
グローバルなエラー配列にエラーを追加するスクリプトを実行します。別の「exit_functions」ファイルでスクリプトを呼び出すエラー トラップがあります。
この exit_functions ファイルでは、さまざまなことを行いますが、問題があるのは、この配列を実行し、実際にはコマンドである配列要素を引き出すループです。これらのコマンドは、通常の. /path/to/functions_file 構文。
ロギングなどの他のすべての機能は exit_functions ファイルから機能しています。これらの特定の機能だけを呼び出すことはできません。エラーが発生します:
/functions/exit_functions: line 109: closeSSHTunnel /tmp/ssh_tunnel_iA0yj.lck: No such file or directory
現在、killSSHTunnel は、他の関数ファイルが含まれていたのと同じように、以前に含まれていた関数ファイルにある関数です。これらの関数呼び出しを配列から使用した場合にのみ、このエラーが発生します。
適切に説明したかどうかわかりません。他の情報を提供できる場合はお知らせください。
以下の完全な機能コードを編集します。
/functions/exit_functions ファイル: exitTrap (){ local LCL_SCRIPT_ERROR
if [ $ERR_COUNT_EXIT_FUNCT -gt 0 ]; then
for LCL_SCRIPT_ERROR in "${ERROR_ARRAY[@]}"; do
case $LCL_SCRIPT_ERROR in
SVN_IMPORT ) # match the SVN_IMPORT error name and search for specific commands to run
exitMsg "$LCL_SCRIPT_ERROR; 111"
executeErrorActions $LCL_SCRIPT_ERROR
exitScript 111
;;
* ) exitMsg "$LCL_SCRIPT_ERROR; 255"
exitScript 255
;;
esac
done
fi
}
したがって、私のテスト コードは、上記の関数 (exitTrap) を呼び出すエラー状態を導入します。ERROR_ARRAY という名前の配列が既に取り込まれています。
そのため、同じく /functions/exit_functions にある executeErrorActions 関数は、連想配列 ERROR_ACTION_ARRAY をループし、(このテストでは) SVN_IMPORTという名前のキーを探します。このキーが見つかると、':' で区切られた文字列を探します。区切られた各セクションは、このエラー状態が発生したときに実行する個別のコマンドになります。私のテストでは、次のような単一のエントリ (区切り記号なし) があります: *closeSSHTunnel /tmp/ssh_tunnel_iA0yj.lck*
さて、以下の関数では、IFS= と未設定の IFS の間にセクションを含めず、代わりに以下の二重コメント ハッシュを含む 1 行を使用すると正常に動作します。IFS セパレーターを導入して文字列を分割するとすぐに、エラーが発生します。
/functions/exit_functions: 109 行目: closeSSHTunnel /tmp/ssh_tunnel_iA0yj.lck: そのようなファイルまたはディレクトリはありません
executeErrorActions (){
if [ ! $# -eq 1 ]; then
return 1
fi
local ERROR_NAME=$1
local ERROR_ACTION
#ERROR_KEY="SVN_IMPORT"
for ERROR_ACTION in ${!ERROR_ACTION_ARRAY[@]}; do
#echo KEY: $i VALUE: ${ERROR_ACTION_ARRAY[$i]}
if [ $ERROR_NAME == $ERROR_ACTION ]; then
##$(${ERROR_ACTION_ARRAY[$ERROR_ACTION]})
IFS=":"
for i in ${ERROR_ACTION_ARRAY[$ERROR_ACTION]}; do
$i
done
unset IFS
return 0
fi
done
}
これは、2 つの ':' で区切られたコマンド、上記の同じcloseSSHTunnel関数、および単純なls -la呼び出しを使用したテスト実行の set -x 出力です。以下のように addError 関数呼び出しを使用して、これらを ERROR_ACTION_ARRAY に追加します。
addError SVN_IMPORT closeSSHTunnel $SSH_TUNNEL_LCK_FILE:ls -la
これは set -x の出力です。
+ executeErrorActions SVN_IMPORT
+ '[' '!' 1 -eq 1 ']'
+ local ERROR_NAME=SVN_IMPORT
+ local ERROR_ACTION
+ for ERROR_ACTION in '${!ERROR_ACTION_ARRAY[@]}'
+ '[' SVN_IMPORT == SVN_IMPORT ']'
+ IFS=:
+ for i in '${ERROR_ACTION_ARRAY[$ERROR_ACTION]}'
+ 'closeSSHTunnel /tmp/ssh_tunnel_iA0yj.lck'
/functions/exit_functions: line 116: closeSSHTunnel /tmp/ssh_tunnel_iA0yj.lck: No such file or directory
+ for i in '${ERROR_ACTION_ARRAY[$ERROR_ACTION]}'
+ 'ls -la'
/functions/exit_functions: line 116: ls -la: command not found
+ unset IFS
+ return 0
それらの1つが「そのようなファイルまたはディレクトリはありません」と言い、もう1つが「コマンドが見つかりません」と言っていることに注意してください。これは、これを整理しようとしている2日目です!
私の結論は、IFS の変更と文字列の分割が問題を引き起こしているということです。
編集2
IFS 呼び出しを少し移動し、ループ内の「:」文字で IFS を終了し、実行呼び出しの後に再度確立すると、すべてが機能します!!!!!
for ERROR_ACTION in ${!ERROR_ACTION_ARRAY[@]}; do
#echo KEY: $i VALUE: ${ERROR_ACTION_ARRAY[$i]}
if [ $ERROR_NAME == $ERROR_ACTION ]; then
#$(${ERROR_ACTION_ARRAY[$ERROR_ACTION]})
IFS=$':'
for i in ${ERROR_ACTION_ARRAY[$ERROR_ACTION]}; do
unset IFS
$i
IFS=$':'
done
unset IFS
return 0
fi
done
誰でもこれを説明できますか?