#=====================================================# #-------------------------------------- # 如果有源代碼的全局定義, 請在此處定義. #-------------------------------------- if [ -f /etc/bashrc ]; then . /etc/bashrc # --> 讀取/etc/bashrc, 如果存在的話. fi #------------------------------------------------------------- # $DISPLAY的自動設置 (如果還沒設置的話) # 這用於linux - 可能運行的結果不同.... # 問題是不同的終端種類對於'who am i'來說, # 將會給出不同的答案...... # 我還沒發現一種'通用'方法 #------------------------------------------------------------- function get_xserver () { case $TERM in xterm ) XSERVER=$(who am i | awk '{print $NF}' | tr -d ')''(' ) # Ane-Pieter Wieringa建議使用下面這種方式: # I_AM=$(who am i) # SERVER=${I_AM#*(} # SERVER=${SERVER%*)} XSERVER=${XSERVER%%:*} ;; aterm | rxvt) # 找出一些運行在這裏的代碼..... ;; esac } if [ -z ${DISPLAY:=""} ]; then get_xserver if [[ -z ${XSERVER} || ${XSERVER} == $(hostname) || ${XSERVER} == "unix" ]]; then DISPLAY=":0.0" # 在本地主機上顯示 else DISPLAY=${XSERVER}:0.0 # 在遠端主機上顯示 fi fi export DISPLAY #---------- # 一些設置 #---------- ulimit -S -c 0 # 不需要任何coredump set -o notify set -o noclobber set -o ignoreeof set -o nounset #set -o xtrace # 對於調試來說非常有用 # 使能選項: shopt -s cdspell shopt -s cdable_vars shopt -s checkhash shopt -s checkwinsize shopt -s mailwarn shopt -s sourcepath shopt -s no_empty_cmd_completion # 僅限於bash>=2.04 shopt -s cmdhist shopt -s histappend histreedit histverify shopt -s extglob # 對於complete命令(按情況補全)來說是必要的 # 禁用選項: shopt -u mailwarn unset MAILCHECK # 當有郵件到達時, 我不希望我的shell提示我 export TIMEFORMAT=$'\nreal %3R\tuser %3U\tsys %3S\tpcpu %P\n' export HISTIGNORE="&:bg:fg:ll:h" export HOSTFILE=$HOME/.hosts # 將遠端主機的列表放入~/.hosts #----------------------- # 問候, 問侯報文等等... #----------------------- # 先定義一些顏色: red='\e[0;31m' RED='\e[1;31m' blue='\e[0;34m' BLUE='\e[1;34m' cyan='\e[0;36m' CYAN='\e[1;36m' NC='\e[0m' # 沒有顏色 # --> 很好. 與使用"ansi.sys"的DOS效果相同. # 在黑色背景下看起來非常好..... echo -e "${CYAN}This is BASH ${RED}${BASH_VERSION%.*}${CYAN} - DISPLAY on ${RED}$DISPLAY${NC}\n" date if [ -x /usr/games/fortune ]; then /usr/games/fortune -s # 讓我們的每天充滿樂趣.... :-) fi function _exit() # 在退出shell時運行的函數 { echo -e "${RED}Hasta la vista, baby${NC}" } trap _exit EXIT #--------------- # Shell提示符 #--------------- if [[ "${DISPLAY#$HOST}" != ":0.0" && "${DISPLAY}" != ":0" ]]; then HILIT=${red} # 遠端主機: 提示符爲紅 else HILIT=${cyan} # 本地主機: 提示符爲青色 fi # --> 下面提示符函數中\W和\w的替換實例, #+ --> 用來獲得完整路徑名的顯示. function fastprompt() { unset PROMPT_COMMAND case $TERM in *term | rxvt ) PS1="${HILIT}[\h]$NC \W > \[\033]0;\${TERM} [\u@\h] \w\007\]" ;; linux ) PS1="${HILIT}[\h]$NC \W > " ;; *) PS1="[\h] \W > " ;; esac } function powerprompt() { _powerprompt() { LOAD=$(uptime|sed -e "s/.*: \([^,]*\).*/\1/" -e "s/ //g") } PROMPT_COMMAND=_powerprompt case $TERM in *term | rxvt ) PS1="${HILIT}[\A \$LOAD]$NC\n[\h \#] \W > \[\033]0;\${TERM} [\u@\h] \w\007\]" ;; linux ) PS1="${HILIT}[\A - \$LOAD]$NC\n[\h \#] \w > " ;; * ) PS1="[\A - \$LOAD]\n[\h \#] \w > " ;; esac } powerprompt # 這是默認提示符 - 可能比較慢 # 如果很慢的話, 可以使用fastprompt來代替.... #=============================================================== # # 別名和函數 # # 事實上, 這裏定義的一些函數非常大 # (比如'lowercase'), 但是我的機器是512M內存, 所以 ..... # 如果你想讓這個文件小一點, # 可以將這些函數放到腳本中. # # 其中的許多函數來自於bash-2.04 # 中的例子. # #=============================================================== #------------------- # 個人的別名 #------------------- alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # -> 防止偶然的文件誤操作. alias mkdir='mkdir -p' alias h='history' alias j='jobs -l' alias r='rlogin' alias which='type -all' alias ..='cd ..' alias path='echo -e ${PATH//:/\\n}' alias print='/usr/bin/lp -o nobanner -d $LPDEST' # 假設LPDEST被定義 alias pjet='enscript -h -G -fCourier9 -d $LPDEST' # 使用enscript的漂亮的打印 alias background='xv -root -quit -max -rmode 5' # 將一張圖片作爲背景 alias du='du -kh' alias df='df -kTh' # 'ls'家族 (假定使用GNU ls) alias la='ls -Al' # 顯示隱藏文件 alias ls='ls -hF --color' # 爲識別的文件類型添加顏色 alias lx='ls -lXB' # 按擴展名排序 alias lk='ls -lSr' # 按尺寸排序 alias lc='ls -lcr' # 按修改時間排序 alias lu='ls -lur' # 按訪問時間排序 alias lr='ls -lR' # 遞歸ls alias lt='ls -ltr' # 按日期排序 alias lm='ls -al |more' # 管道給'more' alias tree='tree -Csu' # 'ls'的另一種好方法 # 裁減'less' alias more='less' export PAGER=less export LESSCHARSET='latin1' export LESSOPEN='|/usr/bin/lesspipe.sh %s 2>&-' # 如果lesspipe.sh存在, 就用這個 export LESS='-i -N -w -z-4 -g -e -M -X -F -R -P%t?f%f \ :stdin .?pb%pb\%:?lbLine %lb:?bbByte %bb:-...' # 拼寫錯誤 - 純粹個人喜好 :-) alias xs='cd' alias vf='cd' alias moer='more' alias moew='more' alias kk='ll' #---------------- # 一些有趣東西 #---------------- function xtitle () { case "$TERM" in *term | rxvt) echo -n -e "\033]0;$*\007" ;; *) ;; esac } # 別名... alias top='xtitle Processes on $HOST && top' alias make='xtitle Making $(basename $PWD) ; make' alias ncftp="xtitle ncFTP ; ncftp" # .. 和函數 function man () { for i ; do xtitle The $(basename $1|tr -d .[:digit:]) manual command man -F -a "$i" done } function ll(){ ls -l "$@"| egrep "^d" ; ls -lXB "$@" 2>&-| egrep -v "^d|total "; } function te() # xemacs/gnuserv的包裝器 { if [ "$(gnuclient -batch -eval t 2>&-)" == "t" ]; then gnuclient -q "$@"; else ( xemacs "$@" &); fi } #--------------------------- # 與文件和字符串相關的函數: #--------------------------- # 使用名字模式來查找文件: function ff() { find . -type f -iname '*'$*'*' -ls ; } # 使用pattern $1和Execute $2來查找文件: function fe() { find . -type f -iname '*'$1'*' -exec "${2:-file}" {} \; ; } # 在一系列文件中找到模式, 並高亮 function fstr() { OPTIND=1 local case="" local usage="fstr: find string in files. Usage: fstr [-i] \"pattern\" [\"filename pattern\"] " while getopts :it opt do case "$opt" in i) case="-i " ;; *) echo "$usage"; return;; esac done shift $(( $OPTIND - 1 )) if [ "$#" -lt 1 ]; then echo "$usage" return; fi local SMSO=$(tput smso) local RMSO=$(tput rmso) find . -type f -name "${2:-*}" -print0 | xargs -0 grep -sn ${case} "$1" 2>&- | \ sed "s/$1/${SMSO}\0${RMSO}/gI" | more } function cuttail() # 在文件中切掉n行, 默認爲10行 { nlines=${2:-10} sed -n -e :a -e "1,${nlines}!{P;N;D;};N;ba" $1 } function lowercase() # 將文件名轉換爲小寫 { for file ; do filename=${file##*/} case "$filename" in */*) dirname==${file%/*} ;; *) dirname=.;; esac nf=$(echo $filename | tr A-Z a-z) newname="${dirname}/${nf}" if [ "$nf" != "$filename" ]; then mv "$file" "$newname" echo "lowercase: $file --> $newname" else echo "lowercase: $file not changed." fi done } function swap() # 交換兩個文件名 { local TMPFILE=tmp.$$ mv "$1" $TMPFILE mv "$2" "$1" mv $TMPFILE "$2" } #---------------------- # 進程/系統相關的函數: #---------------------- function my_ps() { ps $@ -u $USER -o pid,%cpu,%mem,bsdtime,command ; } function pp() { my_ps f | awk '!/awk/ && $0~var' var=${1:-".*"} ; } # 這個函數與linux上的'killall'基本一致 # 但是與Solaris上的卻不相同 function killps() # 按進程名進行kill { local pid pname sig="-TERM" # 默認signal if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; then echo "Usage: killps [-SIGNAL] pattern" return; fi if [ $# = 2 ]; then sig=$1 ; fi for pid in $(my_ps| awk '!/awk/ && $0~pat { print $1 }' pat=${!#} ) ; do pname=$(my_ps | awk '$1~var { print $5 }' var=$pid ) if ask "Kill process $pid <$pname> with signal $sig?" then kill $sig $pid fi done } function my_ip() # 獲得IP地址 { MY_IP=$(/sbin/ifconfig ppp0 | awk '/inet/ { print $2 } ' | sed -e s/addr://) MY_ISP=$(/sbin/ifconfig ppp0 | awk '/P-t-P/ { print $3 } ' | sed -e s/P-t-P://) } function ii() # 獲得當前主機相關的信息 { echo -e "\nYou are logged on ${RED}$HOST" echo -e "\nAdditionnal information:$NC " ; uname -a echo -e "\n${RED}Users logged on:$NC " ; w -h echo -e "\n${RED}Current date :$NC " ; date echo -e "\n${RED}Machine stats :$NC " ; uptime echo -e "\n${RED}Memory stats :$NC " ; free my_ip 2>&- ; echo -e "\n${RED}Local IP Address :$NC" ; echo ${MY_IP:-"Not connected"} echo -e "\n${RED}ISP Address :$NC" ; echo ${MY_ISP:-"Not connected"} echo } # 雜項工具: function repeat() # 重複n次的命令 { local i max max=$1; shift; for ((i=1; i <= max ; i++)); do # --> C風格的語法 eval "$@"; done } function ask() { echo -n "$@" '[y/n] ' ; read ans case "$ans" in y*|Y*) return 0 ;; *) return 1 ;; esac } #========================================================================= # # 按情況補全, complete命令 - BASH-2.04及其後續版本 # 大部分摘自bash 2.05文檔 # 和Ian McDonalds的'Bash completion'軟件包(http://www.caliban.org/bash/index.shtml#completion) # 某些特徵可能需要使用bash-2.05a # #========================================================================= if [ "${BASH_VERSION%.*}" \< "2.05" ]; then echo "You will need to upgrade to version 2.05 for programmable completion" return fi shopt -s extglob # 必須的 set +o nounset # 否則某些自動補全將會失敗 complete -A hostname rsh rcp telnet rlogin r ftp ping disk complete -A export printenv complete -A variable export local readonly unset complete -A enabled builtin complete -A alias alias unalias complete -A function function complete -A user su mail finger complete -A helptopic help # 通常與內建命令一樣 complete -A shopt shopt complete -A stopped -P '%' bg complete -A job -P '%' fg jobs disown complete -A directory mkdir rmdir complete -A directory -o default cd # 壓縮 complete -f -o default -X '*.+(zip|ZIP)' zip complete -f -o default -X '!*.+(zip|ZIP)' unzip complete -f -o default -X '*.+(z|Z)' compress complete -f -o default -X '!*.+(z|Z)' uncompress complete -f -o default -X '*.+(gz|GZ)' gzip complete -f -o default -X '!*.+(gz|GZ)' gunzip complete -f -o default -X '*.+(bz2|BZ2)' bzip2 complete -f -o default -X '!*.+(bz2|BZ2)' bunzip2 # Postscript,pdf,dvi.....(譯者: 打印格式相關) complete -f -o default -X '!*.ps' gs ghostview ps2pdf ps2ascii complete -f -o default -X '!*.dvi' dvips dvipdf xdvi dviselect dvitype complete -f -o default -X '!*.pdf' acroread pdf2ps complete -f -o default -X '!*.+(pdf|ps)' gv complete -f -o default -X '!*.texi*' makeinfo texi2dvi texi2html texi2pdf complete -f -o default -X '!*.tex' tex latex slitex complete -f -o default -X '!*.lyx' lyx complete -f -o default -X '!*.+(htm*|HTM*)' lynx html2ps # 多媒體 complete -f -o default -X '!*.+(jp*g|gif|xpm|png|bmp)' xv gimp complete -f -o default -X '!*.+(mp3|MP3)' mpg123 mpg321 complete -f -o default -X '!*.+(ogg|OGG)' ogg123 complete -f -o default -X '!*.pl' perl perl5 # 這是一個'通用的'補全函數 - 當命令具有一個所謂的"長選項"模式it works when commands have # 的時候, 它就會工作, 比如: 'ls --all' 代替 'ls -a' _get_longopts () { $1 --help | sed -e '/--/!d' -e 's/.*--\([^[:space:].,]*\).*/--\1/'| \ grep ^"$2" |sort -u ; } _longopts_func () { case "${2:-*}" in -*) ;; *) return ;; esac case "$1" in \~*) eval cmd="$1" ;; *) cmd="$1" ;; esac COMPREPLY=( $(_get_longopts ${1} ${2} ) ) } complete -o default -F _longopts_func configure bash complete -o default -F _longopts_func wget id info a2ps ls recode _make_targets () { local mdef makef gcmd cur prev i COMPREPLY=() cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} # 如果之前的參數爲-f, 那就返回可能的補全文件名. # 我們可以讓它更智能一些, 並且返回匹配的 # `makefile Makefile *.mk', 不管存在與否 case "$prev" in -*f) COMPREPLY=( $(compgen -f $cur ) ); return 0;; esac # 如果我們需要一個選項, 那就返回可能的posix選項 case "$cur" in -) COMPREPLY=(-e -f -i -k -n -p -q -r -S -s -t); return 0;; esac # 前嘗試`makefile'再嘗試`Makefile' if [ -f makefile ]; then mdef=makefile elif [ -f Makefile ]; then mdef=Makefile else mdef=*.mk # 局部約定 fi # 在我們掃描目標文件之前, 察看makefile文件名是否 # 使用-f指定 for (( i=0; i < ${#COMP_WORDS[@]}; i++ )); do if [[ ${COMP_WORDS[i]} == -*f ]]; then eval makef=${COMP_WORDS[i+1]} # eval for tilde expansion(波浪號擴展) break fi done [ -z "$makef" ] && makef=$mdef # 如果我們有特別偏愛的補全單詞, # 那麼可以限制的補全這個單詞 if [ -n "$2" ]; then gcmd='grep "^$2"' ; else gcmd=cat ; fi # 如果我們不想使用*.mk, 我們可以使用 # 或者使用test -f $makef或者使用輸入重定向 COMPREPLY=( $(cat $makef 2>/dev/null | awk 'BEGIN {FS=":"} /^[^.# ][^=]*:/ {print $1}' | tr -s ' ' '\012' | sort -u | eval $gcmd ) ) } complete -F _make_targets -X '+($*|*.[cho])' make gmake pmake # cvs(1) 補全 _cvs () { local cur prev COMPREPLY=() cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} if [ $COMP_CWORD -eq 1 ] || [ "${prev:0:1}" = "-" ]; then COMPREPLY=( $( compgen -W 'add admin checkout commit diff \ export history import log rdiff release remove rtag status \ tag update' $cur )) else COMPREPLY=( $( compgen -f $cur )) fi return 0 } complete -F _cvs cvs _killall () { local cur prev COMPREPLY=() cur=${COMP_WORDS[COMP_CWORD]} # 獲得進程列表(第一個sed表達式處理 # swap out出去的進程, 第二個 # 獲得進程的basename) COMPREPLY=( $( /usr/bin/ps -u $USER -o comm | \ sed -e '1,1d' -e 's#[]\[]##g' -e 's#^.*/##'| \ awk '{if ($0 ~ /^'$cur'/) print $0}' )) return 0 } complete -F _killall killall killps # 一個元命令補全函數, 用於sudo(8)這種命令, # 需要先對這個命令進行補全, 然後需要按照這個命令自己的補全定義進行補全 # - 當前並不是非常可靠(比如 mount和umount命令 # 就不能很好的工作), 但還是很有用的 - 作者, Ian McDonald, 我修改了一下. _my_command() { local cur func cline cspec COMPREPLY=() cur=${COMP_WORDS[COMP_CWORD]} if [ $COMP_CWORD = 1 ]; then COMPREPLY=( $( compgen -c $cur ) ) elif complete -p ${COMP_WORDS[1]} &>/dev/null; then cspec=$( complete -p ${COMP_WORDS[1]} ) if [ "${cspec%%-F *}" != "${cspec}" ]; then # complete -F <function> # # COMP_CWORD和COMP_WORDS()不是隻讀的, # 所以我們可以在傳遞到補全例程之前, # 設置它們 # 設置當前的標誌號減1 COMP_CWORD=$(( $COMP_CWORD - 1 )) # 獲得函數名 func=${cspec#*-F } func=${func%% *} # 獲得去掉第一個命令後的命令行 cline="${COMP_LINE#$1 }" # 分離當前命令, 傳遞給數組 COMP_WORDS=( $cline ) $func $cline elif [ "${cspec#*-[abcdefgjkvu]}" != "" ]; then # complete -[abcdefgjkvu] #func=$( echo $cspec | sed -e 's/^.*\(-[abcdefgjkvu]\).*$/\1/' ) func=$( echo $cspec | sed -e 's/^complete//' -e 's/[^ ]*$//' ) COMPREPLY=( $( eval compgen $func $cur ) ) elif [ "${cspec#*-A}" != "$cspec" ]; then # complete -A <type> func=${cspec#*-A } func=${func%% *} COMPREPLY=( $( compgen -A $func $cur ) ) fi else COMPREPLY=( $( compgen -f $cur ) ) fi } complete -o default -F _my_command nohup exec eval trace truss strace sotruss gdb complete -o default -F _my_command command type which man nice # 本地變量: # mode:shell-script # sh-shell:bash # End:
linux下bashrc配置
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.