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