我想制作一个简短的剧本,仅用于实验目的。例如,我运行一个命令,如
sudo apt-get install eclipse --yes
而不是在安装命令时显示命令的详细信息,而是显示一个加载栏 ...... (点加载时会弹出点或其他东西)
我尝试过像
这样的事情apt=sudo apt-get install vlc --yes
start()
{
$apt
while $apt;
do
echo -n "."
sleep 0.5
done
}
start
(我打算做的是运行$ apt变量,然后让它继续进行while循环,while循环将确定命令是否正在运行,所以当命令运行时,它将替换verbose点)
答案 0 :(得分:7)
apt-get install vlc --yes >/tmp/apt-get.log & # Run in background, with output redirected
pid=$! # Get PID of background command
while kill -0 $pid # Signal 0 just tests whether the process exists
do
echo -n "."
sleep 0.5
done
将上述内容放入脚本中,然后通过sudo
运行。您无法使用kill
来测试sudo
进程本身,因为您无法向具有其他uid的进程发送信号。
答案 1 :(得分:4)
以上是上述内容的一小部分......
spinner()
{
local pid=$!
local delay=0.75
local spinstr='...'
echo "Loading "
while [ "$(ps a | awk '{print $1}' | grep $pid)" ]; do
local temp=${spinstr#?}
printf "%s " "$spinstr"
local spinstr=$temp${spinstr%"$temp"}
sleep $delay
printf "\b\b\b"
done
printf " \b\b\b\b"
}
使用情况:
(a_long_running_task) &
spinner
打印
正在加载......
正在加载....
加载.....
加载......
当然在同一行。
答案 2 :(得分:1)
Whiptail是为您执行此操作的工具。
,当您完成任务时,可以很容易地为它显示进度条或其他信息。实际上,它是Debian和许多其他发行版所使用的工具,与你正在使用的语境完全相同。
这是我们用来使aptitude安装更友好的代码的简化版本:
pkg=0
setterm -msg off # Disable kernel messages to this terminal
setterm -blank 0 # Disable screen blanking
aptitude -y install <list of packages> | \
tr '[:upper:]' '[:lower:]' | \
while read x; do
case $x in
*upgraded*newly*)
u=${x%% *}
n=${x%% newly installed*}
n=${n##*upgraded, }
r=${x%% to remove*}
r=${r##*installed, }
pkgs=$((u*2+n*2+r))
pkg=0
;;
unpacking*|setting\ up*|removing*\ ...)
if [ $pkgs -gt 0 ]; then
pkg=$((pkg+1))
x=${x%% (*}
x=${x%% ...}
x=$(echo ${x:0:1} | tr '[:lower:]' '[:upper:]')${x:1}
printf "XXX\n$((pkg*100/pkgs))\n${x} ...\nXXX\n$((pkg*100/pkgs))\n"
fi
;;
esac
done | whiptail --title "Installing Packages" \
--gauge "Preparing installation..." 7 70 0
setterm -msg on # Re-enable kernel messages
invoke-rc.d kbd restart # Restore screen blaking to default setting