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ます。別の uid を持つプロセスにシグナルを送信できないためkill、プロセス自体のテストには使用できません。sudo

于 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 に答える