2013-07-04 40 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