我想知道为什么在下面的例子中使用了代码块:
possibly_hanging_job & { sleep ${TIMEOUT}; eval 'kill -9 $!' &> /dev/null; }
这可能是这样编写的(不使用代码块)..right?
possibly_hanging_job &
sleep ${TIMEOUT}
eval 'kill -9 $!' &> /dev/null
答案 0 :(得分:21)
将最后两个命令放在大括号中会清楚地表明“这些不仅仅是我们发生的另外两个命令在可能挂起的长时间运行的进程之后运行;相反,它们是在我们继续使用shell脚本的其余部分之前将其正确关闭所不可或缺的。“如果作者改写了:
command &
a
b
c
不完全清楚a
和b
只是让command
正确结束的一部分。通过这样写:
command & { a; b; }
c
作者更清楚地表明a
和b
存在是为了让command
完全结束并在实际下一步之前清理,{ {1}},发生。
答案 1 :(得分:2)
实际上我甚至想知道为什么会有eval
。据我所知,它应该没有它。
关于你的实际问题:
我想代码块是为了强调sleep
属于kill
。但这没有必要。它也应该像这样工作:
possibly_hanging_job & sleep ${TIMEOUT}; kill -9 $! &> /dev/null