如何在脚本执行过程中隐藏终端中的光标并在命令中断时将其恢复正常?

Sam*_*ami 7 linux bash shell

假设我有一个显示一些动画的脚本:

\n\n
while [ condition ]\ndo\n    echo -ne "\\rfinished \xe1\x95\x99( \xe1\x90\x95 )\xe1\x95\x93 "\n    sleep 0.3\n    echo -ne "\\rfinished \xe1\x95\x95( \xe1\x90\x9b )\xe1\x95\x97 "\n    sleep 0.3\ndone\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是光标在跳舞的小家伙旁边闪烁,这对我来说是一个(轻微的)不便,我更希望光标被隐藏。

\n\n

所以我尝试了tput civis隐藏光标。问题是你需要运行tput cnorm才能使其恢复正常。在我的例子中,如果我尝试:

\n\n
tput civis\nwhile [ condition ]\ndo\n    echo -ne "\\rfinished \xe1\x95\x99( \xe1\x90\x95 )\xe1\x95\x93 "\n    sleep 0.3\n    echo -ne "\\rfinished \xe1\x95\x95( \xe1\x90\x9b )\xe1\x95\x97 "\n    sleep 0.3\ndone\ntput cnorm\n
Run Code Online (Sandbox Code Playgroud)\n\n

这很有效,除非用户Ctrl-C退出我的程序,这将导致他们有一个不可见的光标,这确实很烦人。

\n\n

我尝试像这样运行脚本:

\n\n
./script || tput cnorm\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这没有帮助。(我也希望能够运行脚本./script

\n\n

这开始是一个愚蠢的问题,但现在我真的很想知道如何解决它。

\n\n

那么,这个问题有解决方案吗?还是我必须忍受动画旁边这个闪烁的小光标?

\n

Sea*_*ght 11

你能用吗trap

function cleanup() {
    tput cnorm
}

trap cleanup EXIT

tput civis
while [ condition ]
...
Run Code Online (Sandbox Code Playgroud)