分页: 1 / 1

这个进度条怎么出不来。。【已解决】完整可用代码看10楼

发表于 : 2010-07-26 18:05
ghostry

代码: 全选

#! /bin/bash
##从/dev/cdrom创建iso
isoName=`zenity --entry --text="请你输入新建iso的文件名 (文件名.iso):"`
#echo $iisoname
#dd if=/dev/cdrom of=$isoName | zenity --progress --text="请等待, 正在读取CD ..."
zenity --info --text="此进度条无效,如确定按钮可用则表示进程已结束。中途无法取消。"
#dd if=/dev/cdrom of=$isoName
#dd if=/dev/cdrom of=$isoName& while [ -e /proc/$! ];do echo -n '.';sleep 1;done
i=0
dd if=/dev/cdrom of=$isoName& while [ -e /proc/$! ];do echo -n $i;i=$i+1;sleep 1;done|zenity --progress --text="请等待, 正在读取CD ..."

Re: 这个进度条怎么出不来。。

发表于 : 2010-07-27 0:02
fanhe
zenity的进度条我也搞不懂
API过于简陋,不好搞
我建议还是用虚拟终端的脚本好一点,信息也全
要不就用python的gtk或者qt来得实际点

Re: 这个进度条怎么出不来。。

发表于 : 2010-07-27 6:33
aerofox
看看楼主能不能将脚本改成这个样子:

代码: 全选

#!/bin/bash
##从/dev/cdrom创建iso
isoName=`zenity --entry --text="请你输入新建iso的文件名 (文件名.iso):"`

dd if=/dev/cdrom of=$isoName& 
while [ -e /proc/$! ]; do
    percentage=$(( ))  # (( )) 中填上计算百分比的表达式
    printf "#请等待, 正在读取CD .... %d%%\n" $percentage
    echo $percentage
sleep 1;
done | zenity --progress --text="请等待, 正在读取CD ..."

Re: 这个进度条怎么出不来。。

发表于 : 2010-07-27 9:09
ghostry
看起来是可行的,不过计算百分比需要知道已复制的量和总量。获得文件大小可以用
stat -c %s filename
获得光盘容量的命令我可就不知道了。。

Re: 这个进度条怎么出不来。。

发表于 : 2010-07-27 9:27
ghostry

代码: 全选

$ df /dev/sr0 
文件系统           1K-块      已用      可用 已用% 挂载点
/dev/sr0                466516    466516         0 100% /media/MFL_PRO
找到了这个命令,但是不知道怎么吧466516这数值单独分离出来

Re: 这个进度条怎么出不来。。

发表于 : 2010-07-27 10:33
ghostry

代码: 全选

#! /bin/bash
##从/dev/cdrom创建iso
cdsize=`df /dev/sr0`
isoname=`echo $cdsize|awk -F"[  ]" '{print $12}'|awk -F"[/]" '{print $3}'`
#isoname=`echo $isoname.iso|awk '{ gsub(/ /, "_"); print }'` #取得默认文件名
isoname=`echo $isoname.iso`
cdsize=`echo $cdsize|awk -F"[ ]" '{print $9}'` #获取光盘总大小单位kb
#echo $cdsize
isoName=`zenity --entry --text="请你输入新建iso的文件名 (文件名.iso):" --entry-text=$isoname`
if [ ! $isoName = "" ];then
dd if=/dev/cdrom of=$isoName&
while [ -e /proc/$! ]; do 
	filesize=`stat -c %s $isoName`  
	let   percentage=$filesize/$cdsize*100/1024 
    	printf "#请等待, 正在读取CD .... %d%%\n" $percentage 
        echo $percentage
        sleep 1;
done | zenity --progress --text="请等待, 正在读取CD ..."
fi
目前就是不能点击取消的时候把dd的进程结束掉。。

Re: 这个进度条怎么出不来。。

发表于 : 2010-07-27 12:13
aerofox
在 dd 命令后将进程号保存到 dd_pid 中,然后在 zenity 命令后加 || kill $dd_pid,应该可以用实现楼上要的功能。

Re: 这个进度条怎么出不来。。

发表于 : 2010-07-27 12:55
ghostry

代码: 全选

#! /bin/bash
##从/dev/cdrom创建iso
cdsize=`df /dev/sr0`
isoname=`echo $cdsize|awk -F"[  ]" '{print $12}'|awk -F"[/]" '{print $3}'`
#isoname=`echo $isoname.iso|awk '{ gsub(/ /, "_"); print }'` #取得默认文件名
isoname=`echo $isoname.iso`
cdsize=`echo $cdsize|awk -F"[ ]" '{print $9}'` #获取光盘总大小单位kb
#echo $cdsize
isoName=`zenity --entry --text="请你输入新建iso的文件名 (文件名.iso):" --entry-text=$isoname`
if [ ! $isoName = "" ];then
dd if=/dev/cdrom of=$isoName&
pid_id=$!
echo $pid_id
while [ -e /proc/$! ]; do 
	filesize=`stat -c %s $isoName`  
	let   percentage=$filesize/$cdsize*100/1024 
    	printf "#请等待, 正在读取CD .... %d%%\n" $percentage 
        echo $percentage
        sleep 1;
done | zenity --progress --text="请等待, 正在读取CD ..." ;kill $pid_id
fi
感谢楼上,取消的功能也实现了,目前还有个bug,就是如果光盘卷标带有空格的话,就只能取得前边的一段字符。

Re: 这个进度条怎么出不来。。

发表于 : 2010-07-27 13:39
ghostry

代码: 全选

#! /bin/bash
##从/dev/cdrom创建iso
zenity --info --text="请选择您要保存文件的目录(默认为主目录)"
dirName=`zenity --file-selection --directory 2>/dev/null`
if [ $dirName = "" ];then
cd ~/
else
cd $dirName
fi
filesize=0
cdsize=`df /dev/sr0`
isoname=`echo $cdsize|awk -F"[/]" '{print $5}'`
isoname=`echo $isoname.iso|awk '{ gsub(/ /, "_"); print }'` #取得默认文件名
#isoname=`echo $isoname.iso`
cdsize=`echo $cdsize|awk -F"[ ]" '{print $9}'` #获取光盘总大小单位kb
#echo $cdsize
isoName=`zenity --entry --text="请你输入新建iso的文件名 (文件名.iso):" --entry-text=$isoname`
if [ ! $isoName = "" ];then
dd if=/dev/cdrom of=$isoName&
pid_id=$!
#echo $pid_id
while [ -e /proc/$! ]; do 
	filesize=`stat -c %s $isoName`  
	let   percentage=$filesize/$cdsize*100/1024 
    	printf "#请等待, 正在读取CD .... %d%%\n" $percentage 
        echo $percentage
        sleep 1;
done | zenity --progress --text="请等待, 正在读取CD ..." ;kill $pid_id
fi
完全解决啦