cc0219 发表于 2006-4-18 21:25:09

如何使在shell下cp,mv等操作的时候显示进度条?

有进度条提示的话,感觉心理更舒服些。呵呵。
总感觉自己有看走进度条癖。。。

死性不改 发表于 2006-4-26 16:32:38

~~

好像没有这个选项,要不你自己写个脚本弄个出来吧

wlbookwl 发表于 2006-4-29 16:01:29

可以实现的。哈哈,用java可以实现。读文件写文件IO操作啊。。

zhy2111314 发表于 2006-4-30 10:36:37

rpm安装的时候是怎么实现的?

wlbookwl 发表于 2006-4-30 10:50:02

我想可能是这样实现的:

首先rpm安装包里面一定有很多文件,比如有10个文件。

在安装rpm时,其实内部是使用cp 一个一个复制文件,这样cp完一个文件里就在控制台输入一个#,cp完10个文件就会出输入出个# ,也可以按文件大小不同根据比例输入不同个数的#

例:
   make[###########]60%

当然这个进度条可能不太准确,但你看windows下软件安装及其他软件,都是这么做的。

还有一种办法是自己写个读写文件的工具 ,这样可以实现完全准确的控制条。不过意义好象不太大。

...

zhy2111314 发表于 2006-4-30 10:57:10

http://www.theiling.de/projects/bar.html

BOoRFGOnZ 发表于 2006-4-30 11:45:53

#! /bin/sh

# bar
# 'cat' with ASCII progress bar
# (c) Henrik Theiling
BAR_VERSION=1.4

# Synopsis:
#   'bar' works just like 'cat', but shows a progress bar in ASCII art on stderr.
#   The script's main function is meant to be usable in any Bourne shell to be
#   suitable for install scripts without the need for any additional tool.
#
# Shell Script Usage: bar [options] [files]
# Options:
#   -h      displays help
#   ...
#
# Examples:
#   Normal pipe:
#
#   : bar mypack.tar.bz2 | tar xjpf -
#
#   Individual pipe for each file:
#
#   : bar -c 'tar xjpf -' mypack1.tar.bz2 mypack2.tar.bz2
#
#   Individual pipe, using ${bar_file} variable:
#
#   : bar -c 'echo ${bar_file}: ; gzip -dc | tar tvf -' \
#   :   -e .tar.gz \
#   :   file1 file2 file3 file4 file5 \
#   :         > package-list.txt

#####################################################
# Programs and shell commands:
#
# Required (otherwise this fails):
#
#    if, then, else, fi, expr, test, cat, eval, exec
#    shell functions
#
#    test:
#      a = b
#      a -lt b
#      a -gt b
#      a -le b
#      -f a
#      -n a
#      -z a
#
#    expr:
#      a + b
#      a - b
#      a '*' b
#      a / b
#      a : b
#
# Optional (otherwise this does not show the bar):
#
#    grep, dd, echo, ls, sed, cut
#
#    ls:
#      must output the file size at fifth position.
#
# The command line interface also uses:
#
#    awk
#

####>-SCHNIPP-<########################################################
bar_cat()
{
   # Use this shell function in your own install scripts.

   #####################################################
   # Options:

   # Width of the bar (in ten characters).The default is 76 characters.
   test -z "${BAR_WIDTH}" && test -n "${COLUMNS}" && BAR_WIDTH=${COLUMNS}

   # Check syntax:
   ( expr "${BAR_WIDTH}" + 0 >/dev/null 2>&1 ) || BAR_WIDTH=0
   BAR_WIDTH=`expr ${BAR_WIDTH} + 0` || BAR_WIDTH=0
   test "x${BAR_WIDTH}" = x0 && BAR_WIDTH=76

   # Maximal block size to use for dd.
   test -n "${BAR_BS}" || BAR_BS=1048567

   # BEGIN PERC
   # Whether to show a percentage.
   test -n "${BAR_PERC}" || BAR_PERC=1
   # END PERC

   # BEGIN ETA
   # Whether to show estimated time of arrival (ETA).
   test -n "${BAR_ETA}" || BAR_ETA=1
   # END ETA

   # Width of the trace display:
   # BEGIN TRACE
   test -n "${BAR_TRACE_WIDTH}" || BAR_TRACE_WIDTH=10
   # END TRACE

   # The command to execute for every given file.Each file
   # is piped into this command individually.By default, the
   # files are simply dumped to stdout.
   test -n "${BAR_CMD}" || BAR_CMD=cat

   # The characters to be used in the bar
   test -n "${BAR_L}"|| BAR_L='['
   test -n "${BAR_R}"|| BAR_R=']'
   test -n "${BAR_C0}" || BAR_C0='.'
   test -n "${BAR_C1}" || BAR_C1='='

   # Additional extension to add to each file:
   #BAR_EXT=${BAR_EXT-}

   # Whether to clear bar after termination.Otherwise keep the full bar.
   #BAR_CLEAR=${BAR_CLEAR-0}

   # Unless switched off by user, use the bar by default:
   test -n "${BAR_OK}" || BAR_OK=1

   #####################################################
   BAR_WIDTH=`expr ${BAR_WIDTH} - 3`

   bar_trace=''
   # BEGIN TRACE
   if test "x${BAR_TRACE}" = x1
   then
       BAR_WIDTH=`expr ${BAR_WIDTH} - ${BAR_TRACE_WIDTH}`
       bar_lauf=${BAR_TRACE_WIDTH}
       bar_t_space=''
       bar_t_dot=''
       while test "${bar_lauf}" -gt 1
       do
         bar_t_space="${bar_t_space} "
         bar_t_dot="${bar_t_dot}."
         bar_lauf=`expr ${bar_lauf} - 1`
       done
       bar_trace="${bar_t_space} "
   fi
   # END TRACE

   bar_eta=''
   BAR_GET_TIME='echo'
   # BEGIN ETA
   ( expr 1 + ${SECONDS} >/dev/null 2>&1 ) || BAR_ETA=0
   if test "x${BAR_ETA}" = x1
   then
       BAR_GET_TIME='( echo ${SECONDS} )'
       BAR_WIDTH=`expr ${BAR_WIDTH} - 6`
       bar_eta='--:-- '
   fi
   # END ETA

   bar_perc=''
   # BEGIN PERC
   if test "x${BAR_PERC}" = x1
   then
       BAR_WIDTH=`expr ${BAR_WIDTH} - 5`
       bar_perc='0% '
   fi
   # END PERC

   BAR_GET_SIZE='( ls -l "${BAR_DIR}${bar_file}${BAR_EXT}" | sed "s@*@ @g" | cut -d " " -f 5 ) 2>/dev/null'
       # portable?

   # check features:
   ( ( echo a                   ) >/dev/null 2>&1 ) || BAR_OK=0
   ( ( echo a | dd bs=2 count=2 ) >/dev/null 2>&1 ) || BAR_OK=0
   ( ( echo a | grep a          ) >/dev/null 2>&1 ) || BAR_OK=0
   ( ( echo a | sed 's@*@ @g' ) >/dev/null 2>&1 ) || BAR_OK=0
   ( ( echo a | cut -d ' ' -f 1 ) >/dev/null 2>&1 ) || BAR_OK=0

   # check ranges:
   test "${BAR_WIDTH}" -ge 4 || BAR_OK=0

   BAR_ECHO='echo'
   BAR_E_C1=''
   BAR_E_C2=''
   BAR_E_NL='echo'

   # Does echo accept -n without signalling an error?
   if echo -n abc >/dev/null 2>&1
   then
       BAR_E_C1='-n'
   fi

   # Check how to print a line without newline:
   if ( ( ${BAR_ECHO} "${BAR_E_C1}" abc ; echo 1,2,3 ) | grep n ) >/dev/null 2>&1
   then
       # Try echo \c:
       if ( ( ${BAR_ECHO} 'xyz\c' ; echo 1,2,3 ) | grep c ) >/dev/null 2>&1
       then
         # Try printf:
         if ( ( printf 'ab%s' c ; echo 1,2,3 ) | grep abc ) >/dev/null 2>&1
         then
            BAR_ECHO='printf'
            BAR_E_C1='%s'
         else
            BAR_ECHO=':'
            BAR_E_C1=''
            BAR_E_NL=':'
            BAR_OK=0
         fi
       else
          BAR_E_C1=''
          BAR_E_C2='\c'
       fi
   fi

   # prepare initial bar:
   bar_shown=0
   if test "${BAR_OK}" = 1
   then
       bar_lauf=0
       bar_graph=''
       while test `expr ${bar_lauf} + 5` -le "${BAR_WIDTH}"
       do
         bar_graph="${bar_graph}${BAR_C0}${BAR_C0}${BAR_C0}${BAR_C0}${BAR_C0}"
         bar_lauf=`expr ${bar_lauf} + 5`
       done
       while test "${bar_lauf}" -lt "${BAR_WIDTH}"
       do
         bar_graph="${bar_graph}${BAR_C0}"
         bar_lauf=`expr ${bar_lauf} + 1`
       done
       ${BAR_ECHO} "${BAR_E_C1}" "
${bar_trace}${bar_eta}${bar_perc}${BAR_L}${bar_graph}${BAR_R}
${BAR_E_C2}" 1>&2
       bar_shown=1
   fi

   # for shifting large numbers so that expr can handle them:
   # Assume we can compute up to 2147483647, thus 9 arbitrary digits.
   # We must be able to do + of two numbers of 9 digits length.Ok.
   # BEGIN LARGE
   ( ( test 1999999998 = `expr 999999999 + 999999999` ) >/dev/null 2>&1 ) || BAR_OK=0
   bar_large_num="........."
   bar_div=""
   # END LARGE
   bar_numsuff=""

   # find size:
   bar_size=0
   if test -n "${BAR_SIZE}"
   then
       bar_size=${BAR_SIZE}
       # BEGIN LARGE
       while expr "${bar_size}" : "${bar_large_num}" >/dev/null 2>&1
       do
         bar_div="${bar_div}."
         bar_numsuff="${bar_numsuff}0"
         bar_size=`expr "${bar_size}" : '\(.*\).$'`
       done
       # END LARGE
       BAR_GET_SIZE="echo '${BAR_SIZE}'"
   else
       for bar_file
       do
         bar_size1=0
         if test -f "${BAR_DIR}${bar_file}${BAR_EXT}"
         then
               bar_size1=`eval "${BAR_GET_SIZE}"`

               # BEGIN LARGE
               # divide and upround by pattern matching:
               if test -n "${bar_div}"
               then
                   bar_size1=`expr "${bar_size1}" : '\(.*\)'${bar_div}'$'` || bar_size1=0
               fi

               # adjust if still too large:
               while expr "${bar_size1}" : "${bar_large_num}" >/dev/null 2>&1
               do
                   bar_div="${bar_div}."
                   bar_numsuff="${bar_numsuff}0"
                   bar_size1=`expr "${bar_size1}" : '\(.*\).$'`
                   bar_size=`expr "${bar_size}" : '\(.*\).$'` || bar_size=0
               done

               # upround if necessary:
               if test -n "${bar_div}"
               then
                   bar_size1=`expr "${bar_size1}" + 1`
               fi
               # END LARGE

               # add to total size:
               bar_size=`expr ${bar_size} + ${bar_size1}`

               # BEGIN LARGE
               # adjust if still too large:
               while expr "${bar_size}" : "${bar_large_num}" >/dev/null 2>&1
               do
                   bar_div="${bar_div}."
                   bar_numsuff="${bar_numsuff}0"
                   bar_size=`expr "${bar_size}" : '\(.*\).$'`
               done
               # END LARGE
         else
               BAR_OK=0
         fi
       done
   fi

   bar_quad=`expr ${BAR_WIDTH} '*' ${BAR_WIDTH}`
   test "${bar_size}" -gt "${bar_quad}" || BAR_OK=0

   if test "${BAR_OK}" = 0
   then
       # For some reason, we cannot display the bar.Thus plain operation:
       for bar_file
       do
         if test "${bar_file}" = "/dev/stdin"
         then
               eval "${BAR_CMD}"
         else
               eval "${BAR_CMD}" < "${BAR_DIR}${bar_file}${BAR_EXT}"
         fi
       done
   else
       # Compute wanted bytes per step:
       bar_want_bps=`expr ${bar_size} + ${BAR_WIDTH}`
       bar_want_bps=`expr ${bar_want_bps} - 1`
       bar_want_bps=`expr ${bar_want_bps} / ${BAR_WIDTH}`

       # Compute block count per step to keep within maximum block size:
       bar_count=1
       if test "${bar_want_bps}" -gt "${BAR_BS}"
       then
         bar_count=`expr ${bar_want_bps} + ${BAR_BS}`
         bar_count=`expr ${bar_count} - 1`
         bar_count=`expr ${bar_count} / ${BAR_BS}`
       fi

       # Compute block size for given count:
       bar_wc=`expr ${BAR_WIDTH} '*' ${bar_count}`

       bar_bs=`expr ${bar_size} + ${bar_wc}`
       bar_bs=`expr ${bar_bs} - 1`
       bar_bs=`expr ${bar_bs} / ${bar_wc}`

       # Compute bs * count, the bytes per step:
       bar_bps=`expr ${bar_bs} '*' ${bar_count}`

       # Compute bytes per hundredth:
       bar_bph=`expr ${bar_size} + 99`
       bar_bph=`expr ${bar_bph} / 100`


       # Run loop:
       bar_pos=0
       bar_graph="${BAR_L}"
       bar_cur_char=0
       bar_t0=`eval "${BAR_GET_TIME}" 2>/dev/null` || bar_t0=0
       for bar_file
       do
         # BEGIN TRACE
         if test "x${BAR_TRACE}" = x1
         then
               bar_trace=`expr "${bar_file}" : '.*/\([^/][^/]*\)$'` || bar_trace="${bar_file}"
               bar_trace=`expr "${bar_trace}${bar_t_space}" : '\('${bar_t_dot}'\)'`
               bar_trace="${bar_trace} "
         fi
         # END TRACE
         # Initial character position in bar for file:
         bar_char=`expr ${bar_pos} / ${bar_want_bps}` || bar_char=0
         while test "${bar_char}" -gt `expr ${bar_cur_char} + 4`
         do
               bar_graph="${bar_graph}${BAR_C1}${BAR_C1}${BAR_C1}${BAR_C1}${BAR_C1}"
               bar_cur_char=`expr ${bar_cur_char} + 5`
         done
         while test "${bar_char}" -gt "${bar_cur_char}"
         do
               bar_graph="${bar_graph}${BAR_C1}"
               bar_cur_char=`expr ${bar_cur_char} + 1`
         done

         # Get file size.This must work now (we checked with test -f before).
         bar_size1=`eval "${BAR_GET_SIZE}" 2>/dev/null` || bar_size1=0

         # BEGIN LARGE
         # Divide and upround by pattern matching:
         if test -n "${bar_div}"
         then
               bar_size1=`expr "${bar_size1}" : '\(.*\)'${bar_div}'$'` || bar_size1=0
               bar_size1=`expr "${bar_size1}" + 1`
         fi
         # END LARGE

         # loop:
         bar_total=0
         (
               exec 6>&1
               exec 5<"${BAR_DIR}${bar_file}${BAR_EXT}"
               while test "${bar_total}" -lt "${bar_size1}"
               do
                   dd bs="${bar_bs}" count="${bar_count}${bar_numsuff}" <&5 >&6 2>/dev/null
                   bar_total=`expr ${bar_total} + ${bar_bps}`
                   if test "${bar_total}" -gt "${bar_size1}"
                   then
                     bar_total="${bar_size1}"
                   fi
                   bar_pos1=`expr ${bar_pos} + ${bar_total}`
                   bar_proz=`expr ${bar_pos1} / ${bar_bph}` || bar_proz=0
                   # BEGIN PERC
                   if test "x${BAR_PERC}" = x1
                   then
                     bar_perc="${bar_proz}% "
                     bar_perc=`expr "${bar_perc}" : '.*\(.....\)$'`
                   fi
                   # END PERC
                   # BEGIN ETA
                   if test "x${BAR_ETA}" = x1
                   then
                     bar_diff=`eval "${BAR_GET_TIME}" 2>/dev/null` || bar_diff=0
                     bar_diff=`expr ${bar_diff} - ${bar_t0} 2>/dev/null` || bar_diff=0
                     bar_100p=`expr 100 - ${bar_proz}` || bar_100p=0
                     bar_diff=`expr ${bar_diff} '*' ${bar_100p}` || bar_diff=0
                     bar_diff=`expr ${bar_diff} + ${bar_proz}` || bar_diff=0
                     bar_diff=`expr ${bar_diff} - 1` || bar_diff=0
                     bar_diff=`expr ${bar_diff} / ${bar_proz} 2>/dev/null` || bar_diff=0
                     if test "${bar_diff}" -gt 0
                     then
                           bar_t_unit=":"
                           if test "${bar_diff}" -gt 2700
                           then
                               bar_t_uni="h"
                               bar_diff=`expr ${bar_diff} / 60`
                           fi
                           bar_diff_h=`expr ${bar_diff} / 60` || bar_diff_h=0
                           if test "${bar_diff_h}" -gt 99
                           then
                               bar_eta="   ${bar_diff_h}${bar_t_unit} "
                           else
                               bar_diff_hi=`expr ${bar_diff_h} '*' 60` || bar_diff_hi=0
                               bar_diff=`expr ${bar_diff} - ${bar_diff_hi}` || bar_diff=0
                               bar_diff=`expr "00${bar_diff}" : '.*\(..\)$'`
                               bar_eta="   ${bar_diff_h}${bar_t_unit}${bar_diff} "
                           fi
                           bar_eta=`expr "${bar_eta}" : '.*\(......\)$'`
                     fi
                   fi
                   # END ETA

                   bar_char=`expr ${bar_pos1} / ${bar_want_bps}` || bar_char=0
                   while test "${bar_char}" -gt "${bar_cur_char}"
                   do
                     bar_graph="${bar_graph}${BAR_C1}"
                     ${BAR_ECHO} "${BAR_E_C1}" "
${bar_trace}${bar_eta}${bar_perc}${bar_graph}${BAR_E_C2}" 1>&2
                     bar_cur_char=`expr ${bar_cur_char} + 1`
                   done
               done
         ) | eval "${BAR_CMD}"
         bar_pos=`expr ${bar_pos} + ${bar_size1}`
       done
       # ${BAR_ECHO} "${BAR_E_C1}" "${BAR_R}${BAR_E_C2}" 1>&2
   fi

   if test "${bar_shown}" = 1
   then
       # BEGIN TRACE
       test "x${BAR_TRACE}" = x1 && bar_trace="${bar_t_space} "
       # END TRACE
       # BEGIN ETA
       test "x${BAR_ETA}" = x1   && bar_eta='      '
       # END ETA
       if test "x${BAR_CLEAR}" = x1
       then
         # BEGIN PERC
         test "x${BAR_PERC}" = x1 && bar_perc='   '
         # END PERC
          bar_lauf=0
         bar_graph=''
         while test `expr ${bar_lauf} + 5` -le "${BAR_WIDTH}"
         do
               bar_graph="${bar_graph}   "
               bar_lauf=`expr ${bar_lauf} + 5`
         done
         while test "${bar_lauf}" -lt "${BAR_WIDTH}"
         do
               bar_graph="${bar_graph} "
               bar_lauf=`expr ${bar_lauf} + 1`
         done
         ${BAR_ECHO} "${BAR_E_C1}" "
${bar_trace}${bar_eta}${bar_perc} ${bar_graph}
${BAR_E_C2}" 1>&2
       else
         # BEGIN PERC
         test "x${BAR_PERC}" = x1 && bar_perc='100% '
         # END PERC
         bar_lauf=0
         bar_graph=''
         while test `expr ${bar_lauf} + 5` -le "${BAR_WIDTH}"
         do
               bar_graph="${bar_graph}${BAR_C1}${BAR_C1}${BAR_C1}${BAR_C1}${BAR_C1}"
               bar_lauf=`expr ${bar_lauf} + 5`
         done
         while test "${bar_lauf}" -lt "${BAR_WIDTH}"
         do
               bar_graph="${bar_graph}${BAR_C1}"
               bar_lauf=`expr ${bar_lauf} + 1`
         done
         ${BAR_ECHO} "${BAR_E_C1}" "
${bar_trace}${bar_eta}${bar_perc}${BAR_L}${bar_graph}${BAR_R}${BAR_E_C2}" 1>&2
         ${BAR_E_NL} 1>&2
       fi
   fi
}
####>-SCHNAPP-<########################################################


BAR_AWK_0=''
# Command line interface:
while test -n "$1"
do
   case "$1" in
       -o|-c|-w|-0|-1|-e|-d|-b|-s|-\[\]|-\[|-\]|-T)
         if test -z "$2"
         then
               echo "$0: Error: A non-empty argument was expected after $1" 1>&2
         fi
         BAR_ARG="$1"
         BAR_OPT="$2"
         shift
         shift
       ;;
       -o*|-c*|-w*|-0*|-1*|-e*|-d*|-b*|-T*)
         BAR_ARG=`expr "$1" : '\(-.\)'`
         BAR_OPT=`expr "$1" : '-.\(.*\)$'`
         shift
       ;;
       -h|-n|-p|-D|-D-|-q|-V|-t|-E|-L)
         BAR_ARG="$1"
         BAR_OPT=""
         shift
       ;;
       --) shift
         break
       ;;
       -*) echo "$0: Error: Unrecognized option: $1" 1>&2
         exit 1
       ;;
       *)
         break
       ;;
   esac

   case "${BAR_ARG}" in
       -h)echo 'Usage: bar [-n] [-p] [-q] [-o FILE] [-c CMD] [-s SIZE] [-b SIZE]'
            echo '         [-w WIDTH] [-0/1/[/] CHAR] [-d DIR] [-e EXT] [Files]'
            echo '       bar -V'
            echo '       bar -D'
            echo '       bar -D-'
            echo 'Options:'
            echo '   -h         displays help'
            echo '   -o FILE    sets output file'
            echo '   -c CMD   sets individual execution command'
            echo '   -e EXT   append an extension to each file'
            echo '   -d DIR   prepend this prefix to each file (a directory must end in /)'
            echo '   -s SIZE    expected number of bytes.Use for pipes.This is a hint'
            echo '                only that must be greater or equal to the amount actually'
            echo '                processed.Further, this only works for single files.'
            echo '   -b SIZE    maximal block size (bytes) (default: 1048567)'
            echo '   -w WIDTH   width in characters      (default: terminal width-3 or 76)'
            echo '   -0 CHAR    character for empty bar    (default: .)'
            echo '   -1 CHAR    character for full bar   (default: =)'
            echo '   -[ CHAR    first character of bar   (default: [)'
            echo '   -] CHAR    lastcharacter of bar   (default: ])'
            echo '   -n         clears bar after termination'
            echo '   -t         traces (=displays) which file is processed'
            echo '   -T WIDTH   no of characters reserved for the file display of -t'
            echo '   -p         hides percentage'
            echo '   -E         hides estimated time display'
            echo '   -q         hides the whole bar, be quiet'
            echo '   -D         tries to dump the bar_cat() shell function, then exit.'
            echo '                Here, -t, -p, -E remove the corresponding feature completely.'
            echo '                Further, -L removes large file support from the code.'
            echo '   -D-      same as -D, but dumps the function body only'
            echo '   -V         displays version number'
            echo '   --         end of options: only file names follow'
            exit 0
       ;;
       -n)BAR_CLEAR=1
       ;;
       -L)BAR_LARGE=0
            BAR_AWK_0="${BAR_AWK_0} /END*LARGE/ {x=1} ;"
            BAR_AWK_0="${BAR_AWK_0} /BEGIN*LARGE/ {x=0} ;"
       ;;
       -t)BAR_TRACE=1
            BAR_AWK_0="${BAR_AWK_0} /END*TRACE/ {x=1} ;"
            BAR_AWK_0="${BAR_AWK_0} /BEGIN*TRACE/ {x=0} ;"
       ;;
       -T)BAR_TRACE_WIDTH="${BAR_OPT}"
       ;;
       -q)BAR_OK=0
       ;;
       -p)BAR_PERC=0
            BAR_AWK_0="${BAR_AWK_0} /END*PERC/ {x=1} ;"
            BAR_AWK_0="${BAR_AWK_0} /BEGIN*PERC/ {x=0} ;"
       ;;
       -E)BAR_ETA=0
            BAR_AWK_0="${BAR_AWK_0} /END*ETA/ {x=1} ;"
            BAR_AWK_0="${BAR_AWK_0} /BEGIN*ETA/ {x=0} ;"
       ;;
       -V)echo "bar v${BAR_VERSION}"
            exit 0
       ;;
       -D)echo "BAR_VERSION=${BAR_VERSION}"
            awk "${BAR_AWK_0}"'{sub(/ *#.*$/,"")} ; /^bar_cat/ {x=1} ; {sub(/^*/,"")} ; /./ {if(x)print} ; /^}/ {x=0}' "$0"
            exit 0
       ;;
       -D-) echo "BAR_VERSION=${BAR_VERSION}"
            awk "${BAR_AWK_0}"'{sub(/ *#.*$/,"")} ; /^}/ {x=0} ; {sub(/^*/,"")} ; /./ {if(x)print} ; /^{/ {x=1}' "$0"
            exit 0
       ;;
       -o)exec 1>"${BAR_OPT}"
       ;;
       -c)BAR_CMD="${BAR_OPT}"
       ;;
       -b)BAR_BS="${BAR_OPT}"
            if BAR_RAW=`expr "${BAR_BS}" : '\(.*\)k$'`
            then
                BAR_BS=`expr ${BAR_RAW} '*' 1024`
            elif BAR_RAW=`expr "${BAR_BS}" : '\(.*\)M$'`
            then
                BAR_BS=`expr ${BAR_RAW} '*' 1048567`
            fi
       ;;
       -s)BAR_SIZE="${BAR_OPT}"
            if BAR_RAW=`expr "${BAR_SIZE}" : '\(.*\)k$'`
            then
                BAR_SIZE=`expr ${BAR_RAW} '*' 1024`
            elif BAR_RAW=`expr "${BAR_SIZE}" : '\(.*\)M$'`
            then
                BAR_SIZE=`expr ${BAR_RAW} '*' 1048567`
            fi
            if test "$#" -gt 1
            then
                echo "Error: -s cannot be specified for multiple input files." 1>&2
                exit 1
            fi
       ;;   
       -e)BAR_EXT="${BAR_OPT}"
       ;;   
       -d)BAR_DIR="${BAR_OPT}"
       ;;   
       -0)BAR_C0="${BAR_OPT}"
       ;;   
       -1)BAR_C1="${BAR_OPT}"
       ;;   
       -\[) BAR_L="${BAR_OPT}"
       ;;
       -\]) BAR_R="${BAR_OPT}"
       ;;
       -\[\])
            BAR_L="${BAR_OPT}"
            BAR_R="${BAR_OPT}"
       ;;
       -w)BAR_WIDTH="${BAR_OPT}"
       ;;
    esac
done

# Invoke main function:
if test "$#" = 0
then
    bar_cat /dev/stdin
else
    bar_cat "$@"
fi

BOoRFGOnZ 发表于 2006-4-30 11:54:45

很早就知道 但是渐渐了忘记这个东西了 :(
就是没有时间看看 希望有时间看看 :-)

wlbookwl 发表于 2006-4-30 12:01:50

楼上,他的原理是什么?

我刚学linux,以前一直搞java ,上面的代码没太看懂原理。


能说一下他的原理吗?

...
页: [1]
查看完整版本: 如何使在shell下cp,mv等操作的时候显示进度条?