如何在循环仍在 Bash 中运行时继续进程

如何在循环仍在 Bash 中运行时继续进程
#!/bin/bash

STR="animated banner"
CLR=$(tput setaf 4)
BLD=$(tput bold)${CLR}
BLK=$(tput blink)
RST=$(tput sgr0)
DLY=0.3

animate() {
printf '%s\r' "$STR"
sleep "$DLY"
while :; do
    for ((i=0;i<${#STR};i++)); do
    l=${STR:0:i};
    r=${STR:i}
    printf '%s%s%s%s\r' "${l}${BLD}${r^}${RST}"
    sleep "$DLY"
    done
done
}

animate

printf "I want to continue this while looping above still or keep running"

当循环仍在运行时,如何继续执行脚本?

答案1

您可以在后台异步运行该函数。由于该函数不会自行退出,因此您需要保存后台进程的 PID,以便稍后根据需要将其终止。

#!/bin/bash

STR="animated banner"
CLR=$(tput setaf 4)
BLD=$(tput bold)${CLR}
BLK=$(tput blink)
RST=$(tput sgr0)
DLY=0.3

animate() {
printf '%s\r' "$STR"
sleep "$DLY"
while :; do
    for ((i=0;i<${#STR};i++)); do
    l=${STR:0:i};
    r=${STR:i}
    printf '%s%s%s%s\r' "${l}${BLD}${r^}${RST}"
    sleep "$DLY"
    done
done
}

animate &
animPID="$!"

printf "I want to continue this while looping above still or keep running"
sleep 2
ls /   # example command to run while the function runs
sleep 1
echo foo
sleep 1
date   # another command
sleep 1
kill "$animPID"
wait

笔记:

  • 最后wait确保脚本在函数退出后结束,而不仅仅是kill退出后结束(一般来说,由于各种原因,发送给函数的信号及其反应可能会延迟)。

  • kill "$animPID"杀死执行该函数的子 shell,而不是其后代(通常可能异步运行)。您的函数除了sleep在 shell 中执行所有操作外,sleep不被杀死也不是问题,因为它会很快自行退出。如果函数更复杂,可能会出现问题。

  • 该函数打印的内容和脚本其余部分打印的内容可能会交错,因此看起来很丑陋或具有误导性。请注意如何echo foo不覆盖整个横幅,并使其中的一部分保留在行中。

相关内容