我有很多問題阻止了我整天。Bash:不能調用函數;沒有這樣的文件或目錄
我有許多功能文件與各種功能的基礎上使用,即。 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的是,在先前已就像其他功能的文件已被列入包括一個功能文件坐在一個功能。我只使用這些函數調用從數組中獲取此錯誤。
我不知道我是否已經正確地描述它 - 請讓我知道如果我可以提供任何其他信息。下面
編輯全功能代碼:
/功能/ exit_functions文件: exitTrap(){ 當地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的數組。
所以executeErrorActions功能,也在/功能/ exit_functions,循環關聯數組,ERROR_ACTION_ARRAY,尋找一個叫鍵(在此測試)SVN_IMPORT了。當它找到這個鍵時,它正在尋找一個以':'分隔的字符串。每個分隔的部分將是一個單獨的命令,當出現這種錯誤情況時我將運行它。在我的測試我有一個單條目(沒有分隔符),其僅僅是:* closeSSHTunnel /tmp/ssh_tunnel_iA0yj.lck*
現在,有了以下的功能,它工作正常,當我不包括之間的部分IFS =和未設置的IFS,而是使用下面具有雙註釋哈希的單行。當我介紹IFS分隔打破串起我得到的錯誤:
/functions/exit_functions: line 109: closeSSHTunnel /tmp/ssh_tunnel_iA0yj.lck: No such file or directory
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
}
下面是使用兩個測試運行的設定-x輸出「:」 delimitered命令,同樣關閉上面的功能功能和簡單的ls -la調用。
addError SVN_IMPORT closeSSHTunnel $SSH_TUNNEL_LCK_FILE:ls -la
這是設置-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
注意如何他們中的一個說:「沒有這樣的文件或目錄,我用下面的addError函數調用這些添加到ERROR_ACTION_ARRAY另一個說'找不到命令'。這是現在第2天試圖解決這個問題!
我的結論是,IFS更改和字符串分裂導致問題。
EDIT 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
任何人都可以解釋這一點嗎?
文件'/ tmp/ssh_tunnel_iA0yj.lck'是否存在? – choroba 2013-03-20 12:57:20
你可以發佈'killSSHTunnel'的代碼並指出哪一行是第109行嗎? – chepner 2013-03-20 13:01:46
@choroba - 我發佈了下面的代碼作爲答案,以便我可以獲得代碼突出顯示。我討厭我不能在這些評論中粘貼代碼。 – ilium007 2013-03-20 13:14:50