如何显示微调框,直到命令行完成工作?换句话说,如果我正在运行脚本,并且想在此脚本运行时显示微调器,并且在脚本完成后微调器消失。
波纹管是常见的微调器代码:
i=1
sp="/-\|"
echo -n ' '
while true
do
printf "\b${sp:i++%${#sp}:1}"
done
如何将先前的微调器代码链接到命令,以使其在命令运行时显示微调器,并且在命令完成工作后微调器消失?如果将命令包含在循环中,它将与微调器一起循环,那么这种情况下的解决方案是什么?
如何显示微调框,直到命令行完成工作?换句话说,如果我正在运行脚本,并且想在此脚本运行时显示微调器,并且在脚本完成后微调器消失。
波纹管是常见的微调器代码:
i=1
sp="/-\|"
echo -n ' '
while true
do
printf "\b${sp:i++%${#sp}:1}"
done
如何将先前的微调器代码链接到命令,以使其在命令运行时显示微调器,并且在命令完成工作后微调器消失?如果将命令包含在循环中,它将与微调器一起循环,那么这种情况下的解决方案是什么?
Answers:
此shell脚本应满足您的需求:
#!/usr/bin/env bash
show_spinner()
{
local -r pid="${1}"
local -r delay='0.75'
local spinstr='\|/-'
local temp
while ps a | awk '{print $1}' | grep -q "${pid}"; do
temp="${spinstr#?}"
printf " [%c] " "${spinstr}"
spinstr=${temp}${spinstr%"${temp}"}
sleep "${delay}"
printf "\b\b\b\b\b\b"
done
printf " \b\b\b\b"
}
("$@") &
show_spinner "$!"
假设将外壳程序脚本存储在名为的文件中spinner,则可以在命令sleep 10运行时像这样调用它以显示微调框:
$ spinner sleep 10
spinner,所以不会。我认为该示例是正确的,假设您为脚本命名spinner。
这是另一个花哨的微调器,您可以像这样使用:
spinner ping google.com
echo "ping exited with exit code $?"
spinner sleep 10
echo "sleep exited with exit code $?"
它具有12个主题,并随机选择一个。
#!/bin/bash
# Shows a spinner while another command is running. Randomly picks one of 12 spinner styles.
# @args command to run (with any parameters) while showing a spinner.
# E.g. ‹spinner sleep 10›
function shutdown() {
tput cnorm # reset cursor
}
trap shutdown EXIT
function cursorBack() {
echo -en "\033[$1D"
}
function spinner() {
# make sure we use non-unicode character type locale
# (that way it works for any locale as long as the font supports the characters)
local LC_CTYPE=C
local pid=$1 # Process Id of the previous running command
case $(($RANDOM % 12)) in
0)
local spin='⠁⠂⠄⡀⢀⠠⠐⠈'
local charwidth=3
;;
1)
local spin='-\|/'
local charwidth=1
;;
2)
local spin="▁▂▃▄▅▆▇█▇▆▅▄▃▂▁"
local charwidth=3
;;
3)
local spin="▉▊▋▌▍▎▏▎▍▌▋▊▉"
local charwidth=3
;;
4)
local spin='←↖↑↗→↘↓↙'
local charwidth=3
;;
5)
local spin='▖▘▝▗'
local charwidth=3
;;
6)
local spin='┤┘┴└├┌┬┐'
local charwidth=3
;;
7)
local spin='◢◣◤◥'
local charwidth=3
;;
8)
local spin='◰◳◲◱'
local charwidth=3
;;
9)
local spin='◴◷◶◵'
local charwidth=3
;;
10)
local spin='◐◓◑◒'
local charwidth=3
;;
11)
local spin='⣾⣽⣻⢿⡿⣟⣯⣷'
local charwidth=3
;;
esac
local i=0
tput civis # cursor invisible
while kill -0 $pid 2>/dev/null; do
local i=$(((i + $charwidth) % ${#spin}))
printf "%s" "${spin:$i:$charwidth}"
cursorBack 1
sleep .1
done
tput cnorm
wait $pid # capture exit code
return $?
}
("$@") &
spinner $!
如果您想要一个与/ bin / sh一起使用并且不依赖扩展bash参数替换的最低公分母微调器,则应该可以使用:
#!/bin/sh
# The command you are waiting on goes between the ( ) here
# The example below returns a non zero return code
(sleep 20 ; /bin/false) &
pid=$! ; i=0
while ps -a | awk '{print $1}' | grep -q "${pid}"
do
c=`expr ${i} % 4`
case ${c} in
0) echo "/\c" ;;
1) echo "-\c" ;;
2) echo "\\ \b\c" ;;
3) echo "|\c" ;;
esac
i=`expr ${i} + 1`
# change the speed of the spinner by altering the 1 below
sleep 1
echo "\b\c"
done
# Collect the return code from the background process
wait ${pid}
ret=$?
# You can report on any errors due to a non zero return code here
exit ${ret}