2013-07-04 39 views
4

我想製作一個簡短的腳本,僅用於實驗目的。例如,我跑的諸如Linux Shell在後臺運行命令時顯示內容

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 

(我打算做的是運行$容易變量,然後使其移動到while循環和while循環將確定該命令正在運行,s o而命令運行時,它將用點代替冗長)

+0

你'while'循環會反覆運行這個命令,檢查它是否成功。你爲什麼認爲語法會檢查第一個是否仍在運行?更何況,你並沒有在後臺運行它,這需要以'&結尾。 – Barmar

+0

我知道它不工作,它只是我之前做過的一個例子,我添加了一個desc。我試圖在底部做什麼,它只是一個視覺例子 – xR34P3Rx

回答

3

這裏有以上這樣的一個小的變化...

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 

此打印出

中.. 。

加載....

加載.....

正在加載......

在同一行,當然。

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 
+0

,但whiptail是爲消息框。至少這就是我所看到的 – xR34P3Rx

+0

狀態欄是一種消息框。 – Flimzy

+0

這顯然比@Barmer的回答要複雜得多,但它也更強大,更漂亮,並且更好地處理錯誤等等。 – Flimzy

6
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

+1。有些注意事項需要符合POSIX標準:(1)'echo -n .'可能會打印出'-n .'後面是換行符而不是'.'而不換行; 'printf .'將始終按預期工作。 (2)POSIX睡眠只接受整數秒。 –

+0

你似乎在正確的軌道上更多的即時通訊尋找,而不是上述人提到的whiptail ...但我得到這個 殺:操作不允許 – xR34P3Rx

+0

我發現東西,似乎是什麼即時尋找,我還沒有嘗試過,但由其外觀判斷http://www.theiling.de/projects/bar.html – xR34P3Rx