在陷阱中创建for循环并不适用于Shell脚本

时间:2015-07-15 03:12:40

标签: bash shell unix

我一直在尝试在脚本中创建陷阱,以基本上创建一些已在后台运行的脚本日志。

每当我在陷阱中引入for循环时,脚本就会停止执行它应该执行的操作:

trap 'terminate' 10
...

write_log(){
    local target=$1
    local file="/tmp/"$target"_log.txt"
    local lines=$(cat /tmp/"$target"_log.txt | wc -l)

    printf "Log for $target\n" >> "log.txt"   # This line is printed


    for ((i=1;i<=$lines;i++));                # Nothing in this loop happens
    do                         
        local start_date=$(date -d "$(sed -n ""$i"p") $file | cut -f1")
        local end_date=$(date -d "$sed -n ""$i"p") $file | cut -f2")
        printf "Logged in $start_date, logged out $end_date" > "log.txt"
    done
}

terminate(){
    for target
    do
        echo "In the for loop!"
        end_session "$target"
        write_log "$target"
    done
    exit 0

}

当我在后台运行脚本并使用

将其终止时
kill -10 (process_id)

脚本停止,并开始执行清理,直到找到for循环。当我在terminate()中删除for循环而不是对end_session()和write_log()进行单独调用时,end_session()工作得很好,而write_log()工作正常 - 直到它到达for循环。

我可能遗漏了一些基本的东西,但我现在已经看了一段时间,似乎无法弄清楚发生了什么。陷阱中的for循环是否有任何限制?

1 个答案:

答案 0 :(得分:1)

该函数挂起,因为括号在日期命令中搞乱了。试试这个:

local start_date=$(date -d "$(sed -n ${i}p "$file" | cut -f1)")
local end_date=$(date -d "$(sed -n ${i}p "$file" | cut -f2)")