#!/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
不覆盖整个横幅,并使其中的一部分保留在行中。