我试图编写一个给定进程号的递归函数,打印出从它产生的子进程的进程数最多k代。以下代码似乎不起作用,因为我想要做的是以一种树状方式打印它,在那里我打印它下面的给定进程的子进程,而不是先打印整个代,然后第二个,然后等等。我正在尝试的更多的是深度优先搜索的精神贯穿"图表"。不知何故,我无法跟踪在某个深度停止的递归级别。如果有人能发现错误,请告诉我。
function descendantsRecursive() {
level=$2
if [[ "$level" -ge 4 ]]
then
exit
fi
result=($(pgrep -P "$1" .))
for pid in "${result[@]}"; do
echo "$level"
echo "$pid"
if [[ "$(pgrep -P $pid)" == '' ]]
then
:
else
descendantsRecursive $pid $(( $level+1 ))
fi
done
}
答案 0 :(得分:2)
显而易见的问题是你的变量是全局的。这对所有人来说都不重要,但是通过调用修改级别这一事实将会产生错误。
此外,调用exit
会终止整个脚本,您只想停止被调用的函数。使用return
一个好习惯是将所有变量声明为local:
local level=$2 pid result
但您也可以使用更少的变量:
function descendantsRecursive() {
local pid
if (( $2 >= 4 )); then return; fi
for pid in $(pgrep -P "$1" .) ; do
echo "$2"
echo "$pid"
# This test is unneeded
if [[ "$(pgrep -P $pid)" == '' ]]
then
:
else
descendantsRecursive $pid $(( $2+1 ))
fi
done
}