4

我想制作一个简短的脚本,仅用于实验目的。例如,我运行一个命令,例如

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 循环将确定命令是否正在运行,因此在命令运行时它将用点替换详细信息)

4

3 回答 3

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 向进程发送信号。

于 2013-07-04T01:57:15.210 回答
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

这打印出来

正在加载...

正在加载....

加载中......

加载中……

当然在同一条线上。

于 2015-10-05T21:14:00.900 回答
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
于 2013-07-04T01:56:58.057 回答