shtool

来自「监控软件rrdtools」· 代码 · 共 1,047 行 · 第 1/3 页

TXT
1,047
字号
fi#   process help optionif [ ".$opt_h" = .yes ]; then    echo "Usage: $toolcmdhelp $str_usage"    exit 0fi#   complain about incorrect number of argumentscase $arg_MODE in    '=' )        if [ $# -ne $arg_NUMS ]; then            echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2            echo "$msgprefix:Hint:  run \`$toolcmd -h' or \`man shtool' for details" 1>&2            exit 1        fi        ;;    '+' )        if [ $# -lt $arg_NUMS ]; then            echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2            echo "$msgprefix:Hint:  run \`$toolcmd -h' or \`man shtool' for details" 1>&2            exit 1        fi        ;;esac#   establish a temporary file on requestif [ ".$gen_tmpfile" = .yes ]; then    if [ ".$TMPDIR" != . ]; then        tmpdir="$TMPDIR"    elif [ ".$TEMPDIR" != . ]; then        tmpdir="$TEMPDIR"    else        tmpdir="/tmp"    fi    tmpfile="$tmpdir/.shtool.$$"    rm -f $tmpfile >/dev/null 2>&1    touch $tmpfile    chmod 600 $tmpfilefi####  DISPATCH INTO SCRIPT BODY##case $tool inecho )    ##    ##  echo -- Print string with optional construct expansion    ##  Copyright (c) 1998-2002 Ralf S. Engelschall <rse@engelschall.com>    ##  Originally written for WML as buildinfo    ##        text="$*"        #   check for broken escape sequence expansion    seo=''    bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'`    if [ ".$bytes" != .3 ]; then        bytes=`echo -E '\1' | wc -c | awk '{ printf("%s", $1); }'`        if [ ".$bytes" = .3 ]; then            seo='-E'        fi    fi        #   check for existing -n option (to suppress newline)    minusn=''    bytes=`echo -n 123 2>/dev/null | wc -c | awk '{ printf("%s", $1); }'`    if [ ".$bytes" = .3 ]; then        minusn='-n'    fi        #   determine terminal bold sequence    term_bold=''    term_norm=''    if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[Bb]'`" != . ]; then        case $TERM in            #   for the most important terminal types we directly know the sequences            xterm|xterm*|vt220|vt220*)                term_bold=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' </dev/null 2>/dev/null`                term_norm=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' </dev/null 2>/dev/null`                ;;            vt100|vt100*|cygwin)                term_bold=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' </dev/null 2>/dev/null`                term_norm=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' </dev/null 2>/dev/null`                ;;            #   for all others, we try to use a possibly existing `tput' or `tcout' utility            * )                paths=`echo $PATH | sed -e 's/:/ /g'`                for tool in tput tcout; do                    for dir in $paths; do                        if [ -r "$dir/$tool" ]; then                            for seq in bold md smso; do # 'smso' is last                                bold="`$dir/$tool $seq 2>/dev/null`"                                if [ ".$bold" != . ]; then                                    term_bold="$bold"                                    break                                fi                            done                            if [ ".$term_bold" != . ]; then                                for seq in sgr0 me rmso init reset; do # 'reset' is last                                    norm="`$dir/$tool $seq 2>/dev/null`"                                    if [ ".$norm" != . ]; then                                        term_norm="$norm"                                        break                                    fi                                done                            fi                            break                        fi                    done                    if [ ".$term_bold" != . -a ".$term_norm" != . ]; then                        break;                    fi                done                ;;        esac        if [ ".$term_bold" = . -o ".$term_norm" = . ]; then            echo "$msgprefix:Warning: unable to determine terminal sequence for bold mode" 1>&2            term_bold=''            term_norm=''        fi    fi        #   determine user name    username=''    if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[uUgG]'`" != . ]; then        username="$LOGNAME"        if [ ".$username" = . ]; then            username="$USER"            if [ ".$username" = . ]; then                username="`(whoami) 2>/dev/null |\                           awk '{ printf("%s", $1); }'`"                if [ ".$username" = . ]; then                    username="`(who am i) 2>/dev/null |\                               awk '{ printf("%s", $1); }'`"                    if [ ".$username" = . ]; then                        username='unknown'                    fi                fi            fi        fi    fi        #   determine user id    userid=''    if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%U'`" != . ]; then        userid="`(id -u) 2>/dev/null`"        if [ ".$userid" = . ]; then            str="`(id) 2>/dev/null`"            if [ ".`echo $str | grep '^uid[ 	]*=[ 	]*[0-9]*('`" != . ]; then                userid=`echo $str | sed -e 's/^uid[ 	]*=[ 	]*//' -e 's/(.*//'`            fi            if [ ".$userid" = . ]; then                userid=`egrep "^${username}:" /etc/passwd 2>/dev/null | \                        sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`                if [ ".$userid" = . ]; then                    userid=`(ypcat passwd) 2>/dev/null |                            egrep "^${username}:" | \                            sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`                    if [ ".$userid" = . ]; then                        userid='?'                    fi                fi            fi        fi    fi        #   determine (primary) group id    groupid=''    if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[gG]'`" != . ]; then        groupid=`egrep "^${username}:" /etc/passwd 2>/dev/null | \                 sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`        if [ ".$groupid" = . ]; then            groupid=`(ypcat passwd) 2>/dev/null | egrep "^${username}:" | \                     sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`            if [ ".$groupid" = . ]; then                groupid='?'            fi        fi    fi        #   determine (primary) group name    groupname=''    if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%g'`" != . ]; then        groupname=`egrep "^[^:]*:[^:]*:${groupid}:" /etc/group 2>/dev/null | \                   sed -e 's/:.*$//'`        if [ ".$groupname" = . ]; then            groupname=`(ypcat group) 2>/dev/null | \                       egrep "^[^:]*:[^:]*:${groupid}:" | \                       sed -e 's/:.*$//'`            if [ ".$groupname" = . ]; then                groupname='?'            fi        fi    fi        #   determine host and domain name    hostname=''    domainname=''    if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%h'`" != . ]; then        hostname="`(uname -n) 2>/dev/null |\                   awk '{ printf("%s", $1); }'`"        if [ ".$hostname" = . ]; then            hostname="`(hostname) 2>/dev/null |\                       awk '{ printf("%s", $1); }'`"            if [ ".$hostname" = . ]; then                hostname='unknown'            fi        fi        case $hostname in            *.* )                domainname=".`echo $hostname | cut -d. -f2-`"                hostname="`echo $hostname | cut -d. -f1`"                ;;        esac    fi    if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%d'`" != . ]; then        if [ ".$domainname" = . ]; then            if [ -f /etc/resolv.conf ]; then                domainname="`egrep '^[ 	]*domain' /etc/resolv.conf | sed -e 'q' |\                             sed -e 's/.*domain//' \                                 -e 's/^[ 	]*//' -e 's/^ *//' -e 's/^	*//' \                                 -e 's/^\.//' -e 's/^/./' |\                             awk '{ printf("%s", $1); }'`"                if [ ".$domainname" = . ]; then                    domainname="`egrep '^[ 	]*search' /etc/resolv.conf | sed -e 'q' |\                                 sed -e 's/.*search//' \                                     -e 's/^[ 	]*//' -e 's/^ *//' -e 's/^	*//' \                                     -e 's/ .*//' -e 's/	.*//' \                                     -e 's/^\.//' -e 's/^/./' |\                                 awk '{ printf("%s", $1); }'`"                fi            fi        fi    fi        #   determine current time    time_day=''    time_month=''    time_year=''    time_monthname=''    if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[DMYm]'`" != . ]; then        time_day=`date '+%d'`        time_month=`date '+%m'`        time_year=`date '+%Y' 2>/dev/null`        if [ ".$time_year" = . ]; then            time_year=`date '+%y'`            case $time_year in                [5-9][0-9]) time_year="19$time_year" ;;                [0-4][0-9]) time_year="20$time_year" ;;            esac        fi        case $time_month in            1|01) time_monthname='Jan' ;;            2|02) time_monthname='Feb' ;;            3|03) time_monthname='Mar' ;;            4|04) time_monthname='Apr' ;;            5|05) time_monthname='May' ;;            6|06) time_monthname='Jun' ;;            7|07) time_monthname='Jul' ;;            8|08) time_monthname='Aug' ;;            9|09) time_monthname='Sep' ;;              10) time_monthname='Oct' ;;              11) time_monthname='Nov' ;;              12) time_monthname='Dec' ;;        esac    fi        #   expand special ``%x'' constructs    if [ ".$opt_e" = .yes ]; then        text=`echo $seo "$text" |\              sed -e "s/%B/${term_bold}/g" \                  -e "s/%b/${term_norm}/g" \                  -e "s/%u/${username}/g" \                  -e "s/%U/${userid}/g" \                  -e "s/%g/${groupname}/g" \                  -e "s/%G/${groupid}/g" \                  -e "s/%h/${hostname}/g" \                  -e "s/%d/${domainname}/g" \                  -e "s/%D/${time_day}/g" \                  -e "s/%M/${time_month}/g" \                  -e "s/%Y/${time_year}/g" \                  -e "s/%m/${time_monthname}/g" 2>/dev/null`    fi        #   create output    if [ .$opt_n = .no ]; then        echo $seo "$text"    else        #   the harder part: echo -n is best, because        #   awk may complain about some \xx sequences.        if [ ".$minusn" != . ]; then            echo $seo $minusn "$text"        else            echo dummy | awk '{ printf("%s", TEXT); }' TEXT="$text"        fi    fi    ;;install )    ##    ##  install -- Install a program, script or datafile    ##  Copyright (c) 1997-2002 Ralf S. Engelschall <rse@engelschall.com>    ##  Originally written for shtool    ##        #   special case: "shtool install -d <dir> [...]" internally    #   maps to "shtool mkdir -f -p -m 755 <dir> [...]"    if [ "$opt_d" = yes ]; then        cmd="$0 mkdir -f -p -m 755"        if [ ".$opt_o" != . ]; then            cmd="$cmd -o '$opt_o'"        fi        if [ ".$opt_g" != . ]; then            cmd="$cmd -g '$opt_g'"        fi        if [ ".$opt_v" = .yes ]; then            cmd="$cmd -v"        fi        if [ ".$opt_t" = .yes ]; then            cmd="$cmd -t"        fi        for dir in "$@"; do            eval "$cmd $dir" || exit $?        done        exit 0    fi        #   determine source(s) and destination    argc=$#    srcs=""    while [ $# -gt 1 ]; do        srcs="$srcs $1"        shift    done    dstpath="$1"        #   type check for destination    dstisdir=0    if [ -d $dstpath ]; then        dstpath=`echo "$dstpath" | sed -e 's:/$::'`        dstisdir=1    fi        #   consistency check for destination    if [ $argc -gt 2 -a $dstisdir = 0 ]; then        echo "$msgprefix:Error: multiple sources require destination to be directory" 1>&2

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?