sample-bashrc.html

来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 835 行 · 第 1/2 页

HTML
835
字号
295&nbsp;    do296&nbsp;        case "$opt" in297&nbsp;        i) case="-i " ;;298&nbsp;        *) echo "$usage"; return;;299&nbsp;        esac300&nbsp;    done301&nbsp;    shift $(( $OPTIND - 1 ))302&nbsp;    if [ "$#" -lt 1 ]; then303&nbsp;        echo "$usage"304&nbsp;        return;305&nbsp;    fi306&nbsp;    local SMSO=$(tput smso)307&nbsp;    local RMSO=$(tput rmso)308&nbsp;    find . -type f -name "${2:-*}" -print0 | xargs -0 grep -sn ${case} "$1" 2&#62;&#38;- | \309&nbsp;sed "s/$1/${SMSO}\0${RMSO}/gI" | more310&nbsp;}311&nbsp;312&nbsp;function cuttail() # 在文件中切掉n行, 默认为10行313&nbsp;{314&nbsp;    nlines=${2:-10}315&nbsp;    sed -n -e :a -e "1,${nlines}!{P;N;D;};N;ba" $1316&nbsp;}317&nbsp;318&nbsp;function lowercase()  # 将文件名转换为小写319&nbsp;{320&nbsp;    for file ; do321&nbsp;        filename=${file##*/}322&nbsp;        case "$filename" in323&nbsp;        */*) dirname==${file%/*} ;;324&nbsp;        *) dirname=.;;325&nbsp;        esac326&nbsp;        nf=$(echo $filename | tr A-Z a-z)327&nbsp;        newname="${dirname}/${nf}"328&nbsp;        if [ "$nf" != "$filename" ]; then329&nbsp;            mv "$file" "$newname"330&nbsp;            echo "lowercase: $file --&#62; $newname"331&nbsp;        else332&nbsp;            echo "lowercase: $file not changed."333&nbsp;        fi334&nbsp;    done335&nbsp;}336&nbsp;337&nbsp;function swap()         # 交换两个文件名338&nbsp;{339&nbsp;    local TMPFILE=tmp.$$340&nbsp;    mv "$1" $TMPFILE341&nbsp;    mv "$2" "$1"342&nbsp;    mv $TMPFILE "$2"343&nbsp;}344&nbsp;345&nbsp;346&nbsp;#----------------------347&nbsp;# 进程/系统相关的函数:348&nbsp;#----------------------349&nbsp;350&nbsp;function my_ps() { ps $@ -u $USER -o pid,%cpu,%mem,bsdtime,command ; }351&nbsp;function pp() { my_ps f | awk '!/awk/ &#38;&#38; $0~var' var=${1:-".*"} ; }352&nbsp;353&nbsp;# 这个函数与linux上的'killall'基本一致354&nbsp;# 但是与Solaris上的却不相同355&nbsp;function killps()   # 按进程名进行kill356&nbsp;{357&nbsp;    local pid pname sig="-TERM"   # 默认signal358&nbsp;    if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; then359&nbsp;        echo "Usage: killps [-SIGNAL] pattern"360&nbsp;        return;361&nbsp;    fi362&nbsp;    if [ $# = 2 ]; then sig=$1 ; fi363&nbsp;    for pid in $(my_ps| awk '!/awk/ &#38;&#38; $0~pat { print $1 }' pat=${!#} ) ; do364&nbsp;        pname=$(my_ps | awk '$1~var { print $5 }' var=$pid )365&nbsp;        if ask "Kill process $pid &#60;$pname&#62; with signal $sig?"366&nbsp;            then kill $sig $pid367&nbsp;        fi368&nbsp;    done369&nbsp;}370&nbsp;371&nbsp;function my_ip() # 获得IP地址372&nbsp;{373&nbsp;    MY_IP=$(/sbin/ifconfig ppp0 | awk '/inet/ { print $2 } ' | sed -e s/addr://)374&nbsp;    MY_ISP=$(/sbin/ifconfig ppp0 | awk '/P-t-P/ { print $3 } ' | sed -e s/P-t-P://)375&nbsp;}376&nbsp;377&nbsp;function ii()   # 获得当前主机相关的信息378&nbsp;{379&nbsp;    echo -e "\nYou are logged on ${RED}$HOST"380&nbsp;    echo -e "\nAdditionnal information:$NC " ; uname -a381&nbsp;    echo -e "\n${RED}Users logged on:$NC " ; w -h382&nbsp;    echo -e "\n${RED}Current date :$NC " ; date383&nbsp;    echo -e "\n${RED}Machine stats :$NC " ; uptime384&nbsp;    echo -e "\n${RED}Memory stats :$NC " ; free385&nbsp;    my_ip 2&#62;&#38;- ;386&nbsp;    echo -e "\n${RED}Local IP Address :$NC" ; echo ${MY_IP:-"Not connected"}387&nbsp;    echo -e "\n${RED}ISP Address :$NC" ; echo ${MY_ISP:-"Not connected"}388&nbsp;    echo389&nbsp;}390&nbsp;391&nbsp;# 杂项工具:392&nbsp;393&nbsp;function repeat()       # 重复n次的命令394&nbsp;{395&nbsp;    local i max396&nbsp;    max=$1; shift;397&nbsp;    for ((i=1; i &#60;= max ; i++)); do  # --&#62; C风格的语法398&nbsp;        eval "$@";399&nbsp;    done400&nbsp;}401&nbsp;402&nbsp;function ask()403&nbsp;{404&nbsp;    echo -n "$@" '[y/n] ' ; read ans405&nbsp;    case "$ans" in406&nbsp;        y*|Y*) return 0 ;;407&nbsp;        *) return 1 ;;408&nbsp;    esac409&nbsp;}410&nbsp;411&nbsp;#=========================================================================412&nbsp;#413&nbsp;# 按情况补全, complete命令 - BASH-2.04及其后续版本414&nbsp;# 大部分摘自bash 2.05文档415&nbsp;# 和Ian McDonalds的'Bash completion'软件包(http://www.caliban.org/bash/index.shtml#completion)416&nbsp;# 某些特征可能需要使用bash-2.05a417&nbsp;#418&nbsp;#=========================================================================419&nbsp;420&nbsp;if [ "${BASH_VERSION%.*}" \&#60; "2.05" ]; then421&nbsp;    echo "You will need to upgrade to version 2.05 for programmable completion"422&nbsp;    return423&nbsp;fi424&nbsp;425&nbsp;shopt -s extglob        # 必须的426&nbsp;set +o nounset          # 否则某些自动补全将会失败427&nbsp;428&nbsp;complete -A hostname   rsh rcp telnet rlogin r ftp ping disk429&nbsp;complete -A export     printenv430&nbsp;complete -A variable   export local readonly unset431&nbsp;complete -A enabled    builtin432&nbsp;complete -A alias      alias unalias433&nbsp;complete -A function   function434&nbsp;complete -A user       su mail finger435&nbsp;436&nbsp;complete -A helptopic  help     # 通常与内建命令一样437&nbsp;complete -A shopt      shopt438&nbsp;complete -A stopped -P '%' bg439&nbsp;complete -A job -P '%'     fg jobs disown440&nbsp;441&nbsp;complete -A directory  mkdir rmdir442&nbsp;complete -A directory   -o default cd443&nbsp;444&nbsp;# 压缩445&nbsp;complete -f -o default -X '*.+(zip|ZIP)'  zip446&nbsp;complete -f -o default -X '!*.+(zip|ZIP)' unzip447&nbsp;complete -f -o default -X '*.+(z|Z)'      compress448&nbsp;complete -f -o default -X '!*.+(z|Z)'     uncompress449&nbsp;complete -f -o default -X '*.+(gz|GZ)'    gzip450&nbsp;complete -f -o default -X '!*.+(gz|GZ)'   gunzip451&nbsp;complete -f -o default -X '*.+(bz2|BZ2)'  bzip2452&nbsp;complete -f -o default -X '!*.+(bz2|BZ2)' bunzip2453&nbsp;# Postscript,pdf,dvi.....(译者: 打印格式相关)454&nbsp;complete -f -o default -X '!*.ps'  gs ghostview ps2pdf ps2ascii455&nbsp;complete -f -o default -X '!*.dvi' dvips dvipdf xdvi dviselect dvitype456&nbsp;complete -f -o default -X '!*.pdf' acroread pdf2ps457&nbsp;complete -f -o default -X '!*.+(pdf|ps)' gv458&nbsp;complete -f -o default -X '!*.texi*' makeinfo texi2dvi texi2html texi2pdf459&nbsp;complete -f -o default -X '!*.tex' tex latex slitex460&nbsp;complete -f -o default -X '!*.lyx' lyx461&nbsp;complete -f -o default -X '!*.+(htm*|HTM*)' lynx html2ps462&nbsp;# 多媒体463&nbsp;complete -f -o default -X '!*.+(jp*g|gif|xpm|png|bmp)' xv gimp464&nbsp;complete -f -o default -X '!*.+(mp3|MP3)' mpg123 mpg321465&nbsp;complete -f -o default -X '!*.+(ogg|OGG)' ogg123466&nbsp;467&nbsp;468&nbsp;469&nbsp;complete -f -o default -X '!*.pl'  perl perl5470&nbsp;471&nbsp;# 这是一个'通用的'补全函数 - 当命令具有一个所谓的"长选项"模式it works when commands have472&nbsp;# 的时候, 它就会工作, 比如: 'ls --all' 代替 'ls -a'473&nbsp;474&nbsp;_get_longopts () 475&nbsp;{ 476&nbsp;    $1 --help | sed  -e '/--/!d' -e 's/.*--\([^[:space:].,]*\).*/--\1/'| \477&nbsp;grep ^"$2" |sort -u ;478&nbsp;}479&nbsp;480&nbsp;_longopts_func ()481&nbsp;{482&nbsp;    case "${2:-*}" in483&nbsp;	-*)	;;484&nbsp;	*)	return ;;485&nbsp;    esac486&nbsp;487&nbsp;    case "$1" in488&nbsp;	\~*)	eval cmd="$1" ;;489&nbsp;	*)	cmd="$1" ;;490&nbsp;    esac491&nbsp;    COMPREPLY=( $(_get_longopts ${1} ${2} ) )492&nbsp;}493&nbsp;complete  -o default -F _longopts_func configure bash494&nbsp;complete  -o default -F _longopts_func wget id info a2ps ls recode495&nbsp;496&nbsp;497&nbsp;_make_targets ()498&nbsp;{499&nbsp;    local mdef makef gcmd cur prev i500&nbsp;501&nbsp;    COMPREPLY=()502&nbsp;    cur=${COMP_WORDS[COMP_CWORD]}503&nbsp;    prev=${COMP_WORDS[COMP_CWORD-1]}504&nbsp;505&nbsp;    # 如果之前的参数为-f, 那就返回可能的补全文件名. 506&nbsp;    # 我们可以让它更智能一些, 并且返回匹配的507&nbsp;    # `makefile Makefile *.mk', 不管存在与否508&nbsp;    case "$prev" in509&nbsp;        -*f)    COMPREPLY=( $(compgen -f $cur ) ); return 0;;510&nbsp;    esac511&nbsp;512&nbsp;    # 如果我们需要一个选项, 那就返回可能的posix选项513&nbsp;    case "$cur" in514&nbsp;        -)      COMPREPLY=(-e -f -i -k -n -p -q -r -S -s -t); return 0;;515&nbsp;    esac516&nbsp;517&nbsp;    # 前尝试`makefile'再尝试`Makefile'518&nbsp;    if [ -f makefile ]; then519&nbsp;        mdef=makefile520&nbsp;    elif [ -f Makefile ]; then521&nbsp;        mdef=Makefile522&nbsp;    else523&nbsp;        mdef=*.mk               # 局部约定524&nbsp;    fi525&nbsp;526&nbsp;    # 在我们扫描目标文件之前, 察看makefile文件名是否527&nbsp;    # 使用-f指定528&nbsp;    for (( i=0; i &#60; ${#COMP_WORDS[@]}; i++ )); do529&nbsp;        if [[ ${COMP_WORDS[i]} == -*f ]]; then530&nbsp;            eval makef=${COMP_WORDS[i+1]}       # eval for tilde expansion(波浪号扩展)531&nbsp;            break532&nbsp;        fi533&nbsp;    done534&nbsp;535&nbsp;        [ -z "$makef" ] &#38;&#38; makef=$mdef536&nbsp;537&nbsp;    # 如果我们有特别偏爱的补全单词, 538&nbsp;    # 那么可以限制的补全这个单词539&nbsp;    if [ -n "$2" ]; then gcmd='grep "^$2"' ; else gcmd=cat ; fi540&nbsp;541&nbsp;    # 如果我们不想使用*.mk, 我们可以使用542&nbsp;    # 或者使用test -f $makef或者使用输入重定向543&nbsp;    COMPREPLY=( $(cat $makef 2&#62;/dev/null | awk 'BEGIN {FS=":"} /^[^.#   ][^=]*:/ {print $1}' | tr -s ' ' '\012' | sort -u | eval $gcmd ) )544&nbsp;}545&nbsp;546&nbsp;complete -F _make_targets -X '+($*|*.[cho])' make gmake pmake547&nbsp;548&nbsp;549&nbsp;# cvs(1) 补全550&nbsp;_cvs ()551&nbsp;{552&nbsp;    local cur prev553&nbsp;    COMPREPLY=()554&nbsp;    cur=${COMP_WORDS[COMP_CWORD]}555&nbsp;    prev=${COMP_WORDS[COMP_CWORD-1]}556&nbsp;557&nbsp;    if [ $COMP_CWORD -eq 1 ] || [ "${prev:0:1}" = "-" ]; then558&nbsp;        COMPREPLY=( $( compgen -W 'add admin checkout commit diff \559&nbsp;        export history import log rdiff release remove rtag status \560&nbsp;        tag update' $cur ))561&nbsp;    else562&nbsp;        COMPREPLY=( $( compgen -f $cur ))563&nbsp;    fi564&nbsp;    return 0565&nbsp;}566&nbsp;complete -F _cvs cvs567&nbsp;568&nbsp;_killall ()569&nbsp;{570&nbsp;    local cur prev571&nbsp;    COMPREPLY=()572&nbsp;    cur=${COMP_WORDS[COMP_CWORD]}573&nbsp;574&nbsp;    # 获得进程列表(第一个sed表达式处理575&nbsp;    # swap out出去的进程, 第二个576&nbsp;    # 获得进程的basename)577&nbsp;    COMPREPLY=( $( /usr/bin/ps -u $USER -o comm  | \578&nbsp;        sed -e '1,1d' -e 's#[]\[]##g' -e 's#^.*/##'| \579&nbsp;        awk '{if ($0 ~ /^'$cur'/) print $0}' ))580&nbsp;581&nbsp;    return 0582&nbsp;}583&nbsp;584&nbsp;complete -F _killall killall killps585&nbsp;586&nbsp;587&nbsp;# 一个元命令补全函数, 用于sudo(8)这种命令, 588&nbsp;# 需要先对这个命令进行补全, 然后需要按照这个命令自己的补全定义进行补全589&nbsp;#  - 当前并不是非常可靠(比如 mount和umount命令590&nbsp;# 就不能很好的工作), 但还是很有用的 - 作者, Ian McDonald, 我修改了一下. 591&nbsp;592&nbsp;_my_command()593&nbsp;{594&nbsp;    local cur func cline cspec595&nbsp;    596&nbsp;    COMPREPLY=()597&nbsp;    cur=${COMP_WORDS[COMP_CWORD]}598&nbsp;599&nbsp;    if [ $COMP_CWORD = 1 ]; then600&nbsp;	COMPREPLY=( $( compgen -c $cur ) )601&nbsp;    elif complete -p ${COMP_WORDS[1]} &#38;&#62;/dev/null; then602&nbsp;	cspec=$( complete -p ${COMP_WORDS[1]} )603&nbsp;	if [ "${cspec%%-F *}" != "${cspec}" ]; then604&nbsp;	    # complete -F &#60;function&#62;605&nbsp;	    #606&nbsp;	    # COMP_CWORD和COMP_WORDS()不是只读的,607&nbsp;	    # 所以我们可以在传递到补全例程之前, 608&nbsp;	    # 设置它们609&nbsp;	610&nbsp;	    # 设置当前的标志号减1611&nbsp;	    COMP_CWORD=$(( $COMP_CWORD - 1 ))612&nbsp;	    # 获得函数名613&nbsp;	    func=${cspec#*-F }614&nbsp;	    func=${func%% *}615&nbsp;	    # 获得去掉第一个命令后的命令行616&nbsp;	    cline="${COMP_LINE#$1 }"617&nbsp;	    # 分离当前命令, 传递给数组618&nbsp;		COMP_WORDS=( $cline )619&nbsp;	    $func $cline620&nbsp;	elif [ "${cspec#*-[abcdefgjkvu]}" != "" ]; then621&nbsp;	    # complete -[abcdefgjkvu]622&nbsp;	    #func=$( echo $cspec | sed -e 's/^.*\(-[abcdefgjkvu]\).*$/\1/' )623&nbsp;	    func=$( echo $cspec | sed -e 's/^complete//' -e 's/[^ ]*$//' )624&nbsp;	    COMPREPLY=( $( eval compgen $func $cur ) )625&nbsp;	elif [ "${cspec#*-A}" != "$cspec" ]; then626&nbsp;	    # complete -A &#60;type&#62;627&nbsp;	    func=${cspec#*-A }628&nbsp;	func=${func%% *}629&nbsp;	COMPREPLY=( $( compgen -A $func $cur ) )630&nbsp;	fi631&nbsp;    else632&nbsp;	COMPREPLY=( $( compgen -f $cur ) )633&nbsp;    fi634&nbsp;}635&nbsp;636&nbsp;637&nbsp;complete -o default -F _my_command nohup exec eval trace truss strace sotruss gdb638&nbsp;complete -o default -F _my_command command type which man nice639&nbsp;640&nbsp;# 本地变量:641&nbsp;# mode:shell-script642&nbsp;# sh-shell:bash643&nbsp;# End:</PRE></FONT></TD></TR></TABLE><HR></DIV></DIV><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="histcommands.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">首页</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="dosbatch.html"ACCESSKEY="N">下一页</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">历史命令</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top">&nbsp;</TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">将DOS批处理文件转换为Shell脚本</TD></TR></TABLE></DIV></BODY></HTML>

⌨️ 快捷键说明

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