#!/bin/bash # # /home/lantw44/.bash_include # # vim: ts=4 sw=4 noet: # # -- UTF-8 -- # # 設定用外部檔案: # (1) 若 .bash_title 存在且未設定自動修改視窗標題,則依照本檔案內定規則修改 # (2) 若 .bash_addps 存在,則第一行的的內容會加到 colorprompting 變數,第二 # 行的內容會加到 nocolorprompting 變數 if [[ "$-" == *i* ]] ; then interactive_shell=1; fi [ "$interactive_shell" ] && echo "Running .bash_include" [ "$interactive_shell" ] && default_tty_setting="`stty -g`" [ "$interactive_shell" ] && TTY="`tty`" && \ if [[ "$TTY" =~ "/dev/tty"[0-9]+ ]]; then tty_short="#v${TTY:8}" elif [[ "$TTY" == "/dev/tty"* ]]; then tty_short="#${TTY:8}" elif [[ "$TTY" == "/dev/pty"* ]]; then tty_short="#p${TTY:8}" elif [[ "$TTY" == "/dev/hvc"* ]]; then tty_short="#h${TTY:8}" elif [[ "$TTY" == "/dev/pts"* ]]; then tty_short="#p${TTY:9}" elif [[ "$TTY" == "/dev/console" ]]; then tty_short="#c${TTY:12}" else unset tty_short fi # Internal Variables colorprompting='\[\e[1;31m\]\!\[\e[m\] \[\e[35m\]$tty_short\[\e[m\][\[\e[1;33m\]\u\[\e[m\]@\[\e[1;32m\]\h\[\e[m\] \[\e[1;36m\]\w\[\e[m\]]\[\e[44;37m\] \j \[\e[m\]' nocolorprompting='\! $tty_short[\u@\h \w] \j ' if [ "$SSH_CONNECTION" ] then colorprompting="\[\e[1;44m\]*\[\e[m\]$colorprompting" nocolorprompting="*$nocolorprompting" fi if [ "$EPREFIX" ] then colorprompting="$colorprompting[\[\e[1;35m\]Prefix\[\e[m\]]" nocolorprompting="$nocolorprompting[Prefix]" fi if [ "$X_SCLS" ] then scl_enabled="`echo "$X_SCLS" | sed 's/ *$//' | tr ' ' ','`" colorprompting="$colorprompting[\[\e[1;35m\]SCL:$scl_enabled\[\e[m\]]" nocolorprompting="$nocolorprompting[SCL:$scl_enabled]" unset scl_enabled fi if [ "$UNDER_JHBUILD" = "true" ] || [ "$CERTIFIED_GNOMIE" = "yes" ] then colorprompting="$colorprompting[\[\e[1;35m\]JHBuild\[\e[m\]]" nocolorprompting="$nocolorprompting[JHBuild]" fi if [ "$ANDROID_BUILD_TOP" ] then colorprompting="$colorprompting[\[\e[1;35m\]Android\[\e[m\]]" nocolorprompting="$nocolorprompting[Android]" fi if [ "$OSTYPE" = "cygwin" ] then colorprompting="$colorprompting[\[\e[1;35m\]Cygwin\[\e[m\]]" nocolorprompting="$nocolorprompting[Cygwin]" fi if [ "$OSTYPE" = "msys" ] then colorprompting="$colorprompting[\[\e[1;35m\]MSYS\[\e[m\]]" nocolorprompting="$nocolorprompting[MSYS]" fi if [ -f "$HOME/.bash_addps" ] then exec 3< "$HOME/.bash_addps" read -u 3 -r oneline colorprompting="$oneline $colorprompting" read -u 3 -r oneline nocolorprompting="$oneline $nocolorprompting" exec 3<&- unset oneline fi colorprompting="${colorprompting}"'\[\e[41;37m\]$lasterror\[\e[m\]' nocolorprompting="${nocolorprompting}"'$lasterror' if [ "$WINDOW" ] then colorprompting="$colorprompting<$WINDOW>" nocolorprompting="$nocolorprompting<$WINDOW>" fi if [ "$TMUX_PANE" ] then colorprompting="$colorprompting$TMUX_PANE" nocolorprompting="$nocolorprompting$TMUX_PANE" fi if [[ "$PROMPT_COMMAND" != "S="* ]]; then if [ "$PROMPT_COMMAND" ] then PROMPT_COMMAND="; $PROMPT_COMMAND" fi PROMPT_COMMAND='S="$?"; [ "$S" != "0" ] && lasterror="($S)" || unset lasterror'"$PROMPT_COMMAND" fi colorprompting="${colorprompting}"'\$ ' nocolorprompting="${nocolorprompting}"'\$ ' colorsecondprompting="\[\e[36m\]-->\[\e[m\] " nocolorsecondprompting="--> " HISTSIZE=2147483647 HISTFILESIZE=2147483647 HISTCONTROL=ignoredups:ignorespace HISTTIMEFORMAT="%F %T " historycountfile="$HOME/.bash_history.count" historybackupfile="$HOME/.bash_history.bak" realpath_program="readlink -f" bgrunfiledir="$HOME/tmp/bgrun-$USER" trashdir="$HOME/trash" # Environment Variables export EDITOR=vim export FCEDIT=vim export VISUAL=vim export PAGER=less export GCC_COLORS=1 export GREP_OPTIONS='--color=auto' # Aliases: Replace common tools alias ll='ls -lF' alias lh='ls -lFh' alias la='ls -lFa' alias lA='ls -lFA' alias rm='rm -i' alias cp='cp -pi' alias mv='mv -i' alias jobs='jobs -l' alias less='less -RS' alias grep='grep --color=always' case "$OSTYPE" in *gnu*|*cygwin*|*msys*) alias ls='ls --color=always -F' ;; *freebsd*|*FreeBSD*) alias ls='CLICOLOR=1 CLICOLOR_FORCE=1 ls -F' export LSCOLORS='ExGxFxdxCxDxDxhbadacad' ;; esac # Aliases: Non-aliased common tools (safe for use in script) alias safe_ls='\ls' alias safe_cp='\cp' alias safe_mv='\mv' alias safe_rm='\rm' alias safe_jobs='\jobs' alias safe_less='\less' alias safe_grep='GREP_OPTIONS= \grep' # Aliases: Command Prompt alias startcolor='PS1=$colorprompting; PS2=$colorsecondprompting' alias stopcolor='PS1=$nocolorprompting; PS2=$nocolorsecondprompting' # Aliases: Language alias cccc='LANG=C;LANGUAGE=C;LC_ALL=C' alias enus='LANG=en_US.UTF-8;LANGUAGE=en_US:en;LC_ALL=en_US.UTF-8' alias big5='LANG=zh_TW.Big5;LANGUAGE=zh_TW:zh:en;LC_ALL=zh_TW.Big5' alias zhtw='LANG=zh_TW.UTF-8;LANGUAGE=zh_TW:zh:en;LC_ALL=zh_TW.UTF-8' # Aliases: Nice Format alias ndate='date +%H:%M:%S---%A---%x' alias npasswd="getent passwd | awk 'BEGIN {FS=\":\"} {printf \"%24s%3s%6s%6s %-28s%-18s>> %s\\n\",\$1,\$2,\$3,\$4,\$6,\$7,\$5}' | $PAGER" alias ngroup="getent group | awk 'BEGIN {FS=\":\"} {printf \"%24s%3s%6s >> %s\\n\",\$1,\$2,\$3,\$4}' | $PAGER" # Aliases: Terminal alias savetty='default_tty_setting=`stty -g`' alias resetty='stty $default_tty_setting' # Aliases: Git, GNU Screen, Vim alias git_log='git log --pretty=format:"%h %ad | %s%d [%an]" --graph --date=iso' alias git_log_color='git log --color --graph --pretty=format:"%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%C(bold blue)<%an>%Creset" --abbrev-commit' alias screen256='screen -T screen-256color' alias vimhtml='vim -c "set ts=2" -c "set sw=2"' # Functions: Shared Internal Functions ####################################### function createdir_askmode () { newdir_mode="$2" if mkdir -p "$1" then echo "Directory $1 is created." printf "Change the mode of the directory... " read -i "$newdir_mode" -p ">>> Mode: " -e newdir_mode chmod "$newdir_mode" "$1" else echo "Cannot create directory $1!" return 1 fi } function check_command_existent () { type "$1" &> /dev/null return $? } function is_file_type () { local filename="$1" local typename="$2" shift 2 [ "`"$@" find "$filename" -maxdepth 0 -type "$typename"`" ] && return 0 return 1 } function get_file_size () { split_arguments "$@" "${prefixlist[@]}" du -s "${arglist[@]}" | { read -d " " dirsize echo "$dirsize" read throwaway } unset arglist unset prefixlist } function get_executable_extension () { local lsloc="`command which ls`" local lsalt="`echo ${lsloc}.* | cut -d ' ' -f 1`" cmp "$lsloc" "$lsalt" &> /dev/null && echo ${lsalt:${#lsloc}} && return } function split_arguments () { local argcount=$# local -i i=0 local prefix_start=0 while [ "$1" ] do if [ "$prefix_start" = "0" ] then if [ "$1" = "--" ] then prefix_start=1 i=0 shift continue else arglist[$i]="$1" fi else prefixlist[$i]="$1" fi i=$i+1 shift done } # Group: Background Tasks #################################################### alias bgr=bgrun alias bgv=bgview alias bgl=bglist alias bgc=bgcount alias bgls=bglist alias bgrm=bgclean function bgrun () { [ "$#" = "0" ] && return 1 [ '!' -d "$bgrunfiledir" ] && createdir_askmode "$bgrunfiledir" 0750 local current_time=`date "+%Y%m%d-%H%M%S"` local cmdname=`echo "$1" | sed -e 's/-/_/g' -e 's/\\//_/g' -e 's/ /_/g'` if [ "`echo "$cmdname" | cut -c 1`" = "_" ] then cmdname=`echo "$cmdname" | cut -c 2-` fi local filename="$bgrunfiledir/$current_time-$cmdname" echo "Writing to $filename" { echo -n "$BASHPID " > "$filename" echo "$@" >> "$filename" exec "$@" &>> "$filename" } & } function bglist () { local viewtime=0 [ "$1" = "--full" ] && viewtime=1 { for i in `find "$bgrunfiledir" -maxdepth 1 -mindepth 1 | sort` do [ "$viewtime" = "1" ] && echo "$i" head -n 1 "$i" | { local procpid local cmdline read -d ' ' procpid read cmdline printf "(%5d) %s\n" "$procpid" "$cmdline" } done } | { if [ "$viewtime" = "1" ] then echo " INDEX TIME PID COMMAND" local readstat=0 local -i i=1 while true do local dateandtime_long local cmdline read dateandtime_long read cmdline [ "$?" '!=' "0" ] && break local dateandtime=`basename "$dateandtime_long"` local part_year="${dateandtime:0:4}" local part_month="${dateandtime:4:2}" local part_date="${dateandtime:6:2}" local part_hour="${dateandtime:9:2}" local part_minute="${dateandtime:11:2}" local part_second="${dateandtime:13:2}" printf '%6d' "$i" echo " $part_year-$part_month-$part_date $part_hour:$part_minute:$part_second $cmdline" i=$i+1 done else echo " INDEX PID COMMAND" cat -n fi } | $PAGER } function bgview () { local -i yourchoice if [ "$1" = "" ] then yourchoice=`bgcount` else if [ "$1" -le "0" ] then yourchoice=$((`bgcount`+$1)) else yourchoice=$1 fi fi echo "Your choice is $yourchoice." local realfilename=`find "$bgrunfiledir" -maxdepth 1 -mindepth 1 | sort | sed -n ${yourchoice}p` head -n 1 "$realfilename" | { read -d ' ' procpid read cmdline echo "PID: $procpid" echo "Command Line: $cmdline" } read -e -p "View '$realfilename' ? " confirm if [ "$confirm" = "n" ] || [ "$confirm" = "N" ] then return 1 fi { printf "===> Process Information: " cat "$realfilename" } | $PAGER } function bgcount () { find "$bgrunfiledir" -maxdepth 1 -mindepth 1 | cut -d - -f 2,3 | wc | awk '{print $2}' } function bgclean () { if [ "$1" = "all" ] then echo "Removing the directory $bgrunfiledir" rm -rf "$bgrunfiledir" & return 0 else split_arguments "$@" local -i i=0 while [ "${arglist[$i]}" ] do arglist[$i]="-e ${arglist[$i]}p" i=$i+1 done local oneline find "$bgrunfiledir" -maxdepth 1 -mindepth 1 | sort | sed -n ${arglist[*]} | { while read oneline do echo "Removing $oneline" rm -f "$oneline" done } fi unset arglist unset prefixlist } function bgdu () { local -i j=1 { echo " INDEX SIZE PID COMMAND" for i in `find "$bgrunfiledir" -maxdepth 1 -mindepth 1 | sort` do head -n 1 "$i" | { local procpid local cmdline read -d ' ' procpid read cmdline printf "%6d %8d (%5d) %s\n" "$j" \ "`get_file_size "$i"`" \ "$procpid" "$cmdline" } j=$j+1 done } | $PAGER } # Group: Configuration Files ################################################# function fetch_remote_file () { local rval printf "==> Fetch remote file \e[1;33m$2\e[m as \e[1;35m$1\e[m ...\n" if check_command_existent curl; then curl -f -o "$1" "$2" rval=$? elif check_command_existent wget; then wget --progress=dot -O "$1" "$2" rval=$? elif check_command_existent fetch; then fetch -o "$1" "$2" rval=$? elif check_command_existent ftp; then ftp -o "$1" "$2" rval=$? else echo "<== Sorry, I don't know how to fetch remote files on your system" return 1 fi if [ "$rval" = "0" ]; then printf "<== \e[1;32mDone\e[m\n" else printf "<== \e[1;31mFailed\e[m\n" fi return $rval } function fetch_and_merge () { local merge_cmd local merge_cmd_prog local local_file="$1" local remote_file="$2" if fetch_remote_file "${local_file}.new" "${remote_file}" then if [ '!' -e "${local_file}" ]; then safe_mv -vf "${local_file}.new" "${local_file}" else while true do echo "" cmp "${local_file}" "${local_file}.new" &> /dev/null && \ echo "Downloaded file is the same as installed one." && \ break printf "Configuration files update tool: " printf "Updating \e[1;35m${local_file}\e[m\n" echo "" echo " Install: Install the new version" echo " Keep: Keep the old version" echo " Retry: Give up downloaded file and try the next mirror" echo "" echo " Diff: View the difference between versions" echo " Merge: Merge two files by yourself" echo "" read -e -p "[I]nstall/(K)eep/(R)etry/(D)iff/(M)erge ? " merge_cmd case "${merge_cmd}" in ''|I|i) safe_mv -vf "${local_file}.new" "${local_file}" break ;; K|k) rm -f "${local_file}.new" break ;; R|r) rm -f "${local_file}.new" return 1 ;; D|d) diff -u "${local_file}" "${local_file}.new" | $PAGER ;; M|m) read -e -p "Merge tool: " -i "$merge_cmd_prog" merge_cmd_prog if $merge_cmd_prog "${local_file}" "${local_file}.new"; then break else echo "Command is exited with error. Please try again." fi ;; *) printf " \e[33m*** Unknown command ***\e[m \n" ;; esac done fi return 0 fi return 1 } function configfile_fetch () { local cgit_mirror_list=( "http://www.tfcis.org/~lantw44/cgit/cgit.cgi/configfile/plain" "http://phantom.tfcis.org/~lantw44/cgit/cgit.cgi/configfile/plain" "http://master.lant.com.tw/~lantw44/cgit/cgit.cgi/configfile/plain") local github_mirror_list=( "https://raw.github.com/lantw44/configfile" "http://raw.github.com/lantw44/configfile") local args local file_url local file_version local completed local -a file_name local -i i local -i j if [ "$1" ]; then file_version="$1" else file_version="master" fi args=("$@") for((i=1, j=0; i<=$#; i++, j++)){ file_name[$j]="${args[$i]}" } if [ -z "$file_name"]; then file_name=("bash_include" "vimrc" "screenrc") fi for file in ${file_name[@]} do completed="false" for site in ${cgit_mirror_list[@]} do [ "$completed" = "true" ] && break file_url="$site/$file?id=$file_version" if fetch_and_merge "$HOME/.${file}" "$file_url" then completed="true" break fi done for site in ${github_mirror_list[@]} do [ "$completed" = "true" ] && break file_url="$site/$file_version/$file" if fetch_and_merge "$HOME/.${file}" "$file_url" then completed="true" break fi done done } function configfile_initial_setup () { cat >> ~/.bashrc << "EOF" if [ -f ~/.bash_include ]; then . ~/.bash_include fi EOF if [[ "$OSTYPE" == *freebsd* ]] || [[ "$OSTYPE" == *FreeBSD* ]]; then cat >> ~/.bash_login << "EOF" GET_TTY_NAME=`tty | cut -c 9` [ "$GET_TTY_NAME" = 'v' ] && echo "Login from local virtual terminal: `tty`" [ "$GET_TTY_NAME" = 'p' ] && echo "Login from pseudo terminal: `tty`" [ "$GET_TTY_NAME" = '/' ] && echo "Login from pseudo terminal: `tty`" unset GET_TTY_NAME EOF fi cat >> ~/.bash_login << "EOF" if [ -f ~/.bashrc ]; then . ~/.bashrc fi EOF echo "Completed. Type \`help_function' to know how to use!" for i in ~/.bashrc ~/.bash_login ~/.bash_profile ~/.shrc ~/.profile do grep -q -e HISTSIZE -e HISTFILESIZE "$i" 2>/dev/null && \ echo "Warning: HISTSIZE or HISTFILESIZE is set in $i!" && \ echo "History file features may not work" done } # Group: New PATH Editor ##################################################### function newpath_init () { unset newpath local pathsp="$pathorgval" local pathentry local -i i eval pathsp='"${pathsp// /\\}"' pathsp="${pathsp//:/ }" i=0 for pathentry in $pathsp do newpath[$i]="${pathentry//\\/ }" i=$i+1 done } function newpath_gen () { local -i i pathmodval="" i=0 while [ "${newpath[$i]}" ] do if [ "$i" != 0 ]; then pathmodval+=":"; fi pathmodval+="${newpath[$i]}" i=$i+1 done } function path_editor () { local newpathvarname local badcommand local command local command_sub local command_sub2 local should_continue="yes" local -i i if [ -z "$1" ] then newpathvarname="PATH" else newpathvarname="$1" fi eval pathorgval=\${${newpathvarname}} newpath_init while [ "$should_continue" ] do i=0 echo -n $'\e[2J\e[0;0H' if [ "$badcommand" = "yes" ]; then printf " \e[33m*** Command \`$command' is unknown ***\e[m \n" badcommand="" fi echo " New PATH Editor for BASH " echo "========================================" echo "Environment Variable: $newpathvarname" echo "----------------------------------------" while [ "${newpath[$i]}" ] do echo "$i: ${newpath[$i]}" i=$i+1 done [ "$i" = '0' ] && echo "(Empty or not declared)" echo "========================================" read -e -p "[A]ppend/(I)nsert/(D)elete/(E)dit/(M)ove/(S)wap/(R)eset/(Q)uit ? " command case "$command" in ''|A|a) read -e -p "Type a new entry: " newpath[$i] ;; I|i) read -e -p "Type a new entry: " command_sub if [ -z "$command_sub" ]; then continue; fi newpath_tmp=( "${newpath[@]}" ) unset newpath newpath="$command_sub" i=0 while [ "${newpath_tmp[$i]}" ] do newpath[$i+1]="${newpath_tmp[$i]}" i=$i+1 done unset newpath_tmp ;; D|d) read -e -p "Index: " command_sub if [ -z "$command_sub" ]; then continue; fi i="$command_sub" i=$i+1 while [ "${newpath[$i]}" ] do newpath[$i-1]="${newpath[$i]}" i=$i+1 done unset newpath[$i-1] ;; E|e) read -e -p "Index: " command_sub read -e -p "Modify this entry: " -i "${newpath[$command_sub]}" newpath[$command_sub] ;; M|m) read -e -p "From: " command_sub read -e -p "To: " command_sub2 if [ "$command_sub" -eq "$command_sub2" ]; then continue; fi cmdsubval="${newpath[$command_sub]}" if [ "$command_sub" -gt "$command_sub2" ]; then i="$command_sub" while [ "$i" -gt "$command_sub2" ] do newpath[$i]="${newpath[$i-1]}" i=$i-1 done newpath[$command_sub2]="$cmdsubval" else i="$command_sub" while [ "$i" -lt "$command_sub2" ] do newpath[$i]="${newpath[$i+1]}" i=$i+1 done newpath[$command_sub2]="$cmdsubval" fi unset cmdsubval ;; S|s) read -e -p "First entry: " command_sub read -e -p "Second entry: " command_sub2 swaptmp="${newpath[$command_sub]}" newpath[$command_sub]="${newpath[$command_sub2]}" newpath[$command_sub2]="$swaptmp" unset swaptmp ;; R|r) read -e -p "Discard all changes [y/N] ? " command_sub if [ "$command_sub" = "y" ]; then eval pathorgval=\${${newpathvarname}} newpath_init fi ;; Q|q) newpath_gen eval export ${newpathvarname}=\"$pathmodval\" echo "${newpathvarname}=$pathmodval" history -s "${newpathvarname}=$pathmodval" should_continue='' ;; *) badcommand="yes" ;; esac done unset newpath unset pathorgval unset pathmodval } function ldpath_editor () { path_editor LD_LIBRARY_PATH } # Obsolete Group: Old PATH Editor ############################################ function split_path_core () { echo "$current_path" | { while read -d : oneline do [ '!' "$oneline" = '^' ] && echo "$oneline" done [ '!' "$oneline" = '^' ] && echo "$oneline" } unset oneline } function split_path () { coproc split_path_core readarray -t -u ${COPROC[0]} patharr wait $COPROC_PID } function update_path () { current_path='' local -i i=0 local firsttime="yes" while [ "${patharr[$i]}" ] do if [ '!' "${patharr[$i]}" = "^" ] then if [ "$firsttime" ] then firsttime='' else current_path+=':' fi current_path+="${patharr[$i]}" fi i=$i+1 done } function old_path_editor_core () { if [ "$1" = "ld" ] then export current_path="$LD_LIBRARY_PATH" else export current_path="$PATH" fi local should_continue="yes" local command local command_sub local command_sub2 local -i i while [ "$should_continue" ] do split_path i=0 echo "========================================" while [ "${patharr[$i]}" ] do echo "$i: ${patharr[$i]}" i=$i+1 done [ "$i" = '0' ] && echo "(Empty or not declared)" echo "========================================" read -e -p "[A]ppend/(D)elete/(E)dit/(M)ove/(R)eset/(Q)uit ? " command case "$command" in ''|A|a) read -e -p "Type a new entry: " patharr[$i] update_path ;; D|d) read -e -p "Index: " command_sub patharr[$command_sub]='^' update_path ;; E|e) read -e -p "Index: " command_sub read -e -p "Modify this entry: " -i "${patharr[$command_sub]}" patharr[$command_sub] update_path ;; M|m) read -e -p "From: " command_sub read -e -p "To: " command_sub2 swaptmp="${patharr[$command_sub]}" patharr[$command_sub]="${patharr[$command_sub2]}" patharr[$command_sub2]="$swaptmp" unset swaptmp update_path ;; R|r) if [ "$1" = "ld" ] then current_path="$LD_LIBRARY_PATH" else current_path="$PATH" fi ;; Q|q) if [ "$1" = "ld" ] then export LD_LIBRARY_PATH="$current_path" echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH" history -s "LD_LIBRARY_PATH=$LD_LIBRARY_PATH" else export PATH="$current_path" echo "PATH=$PATH" history -s "PATH=$PATH" fi should_continue='' ;; *) printf " \e[33m*** Unknown command ***\e[m \n" ;; esac done unset patharr unset current_path } function old_path_editor () { old_path_editor_core } function old_ldpath_editor () { old_path_editor_core ld } # Group: Trash ############################################################### alias trash_put=trash_mv alias trash_add=trash_mv alias trash_list=trash_ls alias trash_ct=trash_count alias trash_restore=trash_recover alias trash_rc=trash_recover alias trash_drop=trash_rm alias trash_clean=trash_rm function trash_mv () { [ "$#" = "0" ] && return 1 [ '!' -d "$trashdir" ] && createdir_askmode "$trashdir" 0700 local original_path local current_time local -i i=0 split_arguments "$@" while [ "${arglist[$i]}" ] do original_path="`"${prefixlist[@]}" $realpath_program "${arglist[$i]}"`" current_time=`date "+%Y%m%d-%H%M%S"` better_time=`date "+%Y-%m-%d %H:%M:%S"` dirname="`basename "${arglist[$i]}" | sed -e 's/-/_/g' -e 's/ /_/g'`" fulldirname="$trashdir/$current_time-$dirname" mkdir -p "$fulldirname" echo "Move: ${arglist[$i]} -> $fulldirname" "${prefixlist[@]}" mv "${arglist[$i]}" "$fulldirname" if [ "$?" = "0" ] then echo "$better_time" > "$fulldirname/information.date" echo "$original_path" > "$fulldirname/information.path" else rmdir "$fulldirname" fi i=$i+1 shift done unset arglist unset prefixlist } function trash_ls () { local -i i=1 local oneline find "$trashdir" -mindepth 1 -maxdepth 1 | sort | { while read oneline do printf "%6d %s %s\n" "$i" \ "$(< "$oneline/information.date")" \ "$(< "$oneline/information.path")" i=$i+1 done } | $PAGER } function trash_cd () { [ -z "$1" ] && return 1 cd `find "$trashdir" -mindepth 1 -maxdepth 1 | sort | sed -n $1p` } function trash_pushd () { [ -z "$1" ] && return 1 pushd `find "$trashdir" -mindepth 1 -maxdepth 1 | sort | sed -n $1p` } function trash_recover () { [ -z "$1" ] && return 1 split_arguments "$@" local -i i=0 while [ "${arglist[$i]}" ] do arglist[$i]="-e ${arglist[$i]}p" i=$i+1 done find "$trashdir" -mindepth 1 -maxdepth 1 | sort | sed -n ${arglist[*]} | { while read oneline do local fromfile="$oneline/`basename "$(< "$oneline/information.path")"`" local tofile="`dirname "$(< "$oneline/information.path")"`" if [ -e "$(< "$oneline/information.path")" ] then echo "Destination file exists." continue fi echo "Move: $fromfile -> $tofile" "${prefixlist[@]}" mv -f "$fromfile" "$tofile" if [ "$?" = "0" ] then echo "Remove: $oneline" rm -rf "$oneline" fi done } unset arglist unset prefixlist } function trash_rm () { split_arguments "$@" local -i i=0 while [ "${arglist[$i]}" ] do arglist[$i]="-e ${arglist[$i]}p" i=$i+1 done trash_dirname=`find "$trashdir" -mindepth 1 -maxdepth 1 | sort | sed -n ${arglist[*]} ` echo 'Type rm -rf $trash_dirname to remove them.' unset arglist unset prefixlist } function trash_count () { find "$trashdir" -mindepth 1 -maxdepth 1 | wc | awk '{print $2}' } function trash_du () { split_arguments "$@" local oneline local -i i=1 find "$trashdir" -maxdepth 1 -mindepth 1 | sort | { while read oneline do printf "%6d %8d %s\n" "$i" \ "`get_file_size "$oneline" -- "${prefixlist[@]}"`" \ "$(< "$oneline/information.path")" i=$i+1 done } | $PAGER unset arglist unset prefixlist } # Tools: Background Notify Daemon ############################################ function check_dmesg () { [ "$#" = "0" ] && return 1 while true do cdm_previous_dmesg_buf="$cdm_current_dmesg_buf" cdm_current_dmesg_buf="`dmesg`" [ "$cdm_previous_dmesg_buf" '!=' "$cdm_current_dmesg_buf" ] && \ [ "$cdm_first_run" = "0" ] && \ echo '===> You should check the system message buffer <===' sleep $1 [ "$?" '!=' "0" ] && return 1 cdm_first_run=0 done } function check_system_status () { [ "$#" = "0" ] && return 1 filename_mail="$MAIL" filename_messages="/var/log/messages" filename_audit="/var/log/audit/audit.log" while true do previous_dmesg_buf="$current_dmesg_buf" current_dmesg_buf="`dmesg`" previous_mail_info="$current_mail_info" current_mail_info="`ls -l "$filename_mail"`" previous_messages_info="$current_messages_info" current_messages_info="`ls -l "$filename_messages"`" previous_audit_info="$current_audit_info" current_audit_info="`ls -l "$filename_audit"`" if [ "$first_run" = "0" ] then [ "$previous_dmesg_buf" '!=' "$current_dmesg_buf" ] && echo "===> The system message buffer is modified (dmesg) <===" [ "$previous_mail_info" '!=' "$current_mail_info" ] && echo "===> Your mailbox $filename_mail is modified <===" [ "$previous_messages_info" '!=' "$current_messages_info" ] && echo "===> $filename_messages is modified <===" [ "$previous_audit_info" '!=' "$current_audit_info" ] && echo "===> $filename_audit is modified <===" fi sleep $1 first_run=0 done } # Tools: Backup ############################################################## function backup_file () { split_arguments "$@" local current_time=`date +%Y%m%d` local rootfilename local -i i=0 local -i j while [ "${arglist[$i]}" ] do if [ '!' -f "${arglist[$i]}" ] then printf "\e[1;31mError\e[m: ${arglist[$i]} does not exist or it is not a regular file.\n" i=$i+1 continue fi rootfilename="${arglist[$i]}.$current_time" if [ -e "$rootfilename" ] then j=0 while [ "$j" -lt "10" ] do if [ -e "$rootfilename.$j" ] then j=$j+1 continue else history -s "$FUNCNAME" "$@" "${prefixlist[@]}" \cp -p "${arglist[$i]}" "$rootfilename.$j" history -s "${prefixlist[@]}" \cp -p "${arglist[$i]}" "$rootfilename.$j" "${prefixlist[@]}" touch -r "${arglist[$i]}" "$rootfilename.$j" history -s "${prefixlist[@]}" touch -r "${arglist[$i]}" "$rootfilename.$j" break fi done if [ '!' "$j" -lt "10" ] then printf "\e[1;31mError\e[m: Can not create a backup file for ${arglist[$i]}.\n" printf "\e[1;33mPlease delete some backup file because I only use 0 - 9.\e[m\n" fi else history -s "$FUNCNAME" "$@" "${prefixlist[@]}" \cp -p "${arglist[$i]}" "$rootfilename" history -s "${prefixlist[@]}" \cp -p "${arglist[$i]}" "$rootfilename" "${prefixlist[@]}" touch -r "${arglist[$i]}" "$rootfilename" history -s "${prefixlist[@]}" touch -r "${arglist[$i]}" "$rootfilename" fi i=$i+1 done unset arglist unset prefixlist } # Tools: Compatibility ####################################################### function fbterm_chewing () { if [ -z "$1" ]; then fbterm -s 14 -- uim-fep -u chewing else local font_size="$1" shift fbterm -s "$font_size" "$@" -- uim-fep -u chewing fi } function gen_ms_inet_shortcut () { [ "$#" != "2" ] && { echo "Usage: $FUNCNAME filename url" } && return 1 { echo "[InternetShortcut]" echo "URL=$2" } > "$1" } function unzip_nomac () { unzip "$@" -x '__MACOSX/*' '*.DS_Store' return $? } # Tools: GNU Screen ########################################################## function mkscreenacl () { local screen_permit_command="select windowlist other meta detach reset hardcopy info redisplay lastmsg next prev xon xoff windows suspend help colon copy paste writebuf readbuf displays stuff attach" while [ "$1" '!=' '' ] do for i in $screen_permit_command do echo "aclchg $1 +x $i" done echo "aclchg $1 -rw \"\#?\"" shift done } # Tools: Interactive ######################################################### function editlink () { local newdest local orgdest split_arguments "$@" local -i i=0 while [ "${arglist[$i]}" ] do if is_file_type "${arglist[$i]}" "l" "${prefixlist[@]}"; then orgdest="`${prefixlist[@]} readlink "${arglist[$i]}"`" read -e -p "EditLink: ${arglist[$i]} -> " -i "$orgdest" newdest else printf "\e[1;33mWarning\e[m: ${arglist[$i]} is not a symbolic link.\n" i=$i+1 continue fi if [ "$newdest" ] && [ "$newdest" '!=' "$orgdest" ]; then "${prefixlist[@]}" rm -f "${arglist[$i]}" "${prefixlist[@]}" ln -sv "$newdest" "${arglist[$i]}" fi i=$i+1 done unset arglist unset prefixlist } function mvfile () { local nocheck=0 [ "$1" = "-n" ] && nocheck=1 && shift split_arguments "$@" local -i i=0 while [ "${arglist[$i]}" ] do if [ "$nocheck" = "0" ] && [ '!' -e "${arglist[$i]}" ] then printf "\e[33mWarning\e[m: ${arglist[$i]} does not exist. (Use -n to override)\n" i=$i+1 continue fi echo "Old name: ${arglist[$i]}" read -p "New name: " -e -i "${arglist[$i]}" new_file_name if [ "$new_file_name" ] && [ "${arglist[$i]}" != "$new_file_name" ] then history -s "$FUNCNAME" "$@" "${prefixlist[@]}" mv -iv "${arglist[$i]}" "$new_file_name" history -s "${prefixlist[@]}" mv -iv "${arglist[$i]}" "$new_file_name" fi i=$i+1 done unset arglist unset prefixlist unset new_file_name } function varset () { local varoldvalue local varnewvalue while [ "$1" ] do eval varoldvalue=\${$1} read -r -e -p "$1=" -i "$varoldvalue" varnewvalue eval "$1"='"$varnewvalue"' shift done } # Tools: Memory ############################################################## function get_memory_info () { case "$OSTYPE" in *linux*|*gnu*) local meminfoline="`free -m | safe_grep -i mem`" local swapinfoline="`free -m | safe_grep -i swap`" local memtotal="`echo "$meminfoline" | awk '{print $2}'`" local memused="`echo "$meminfoline" | awk '{print $3}'`" local membuf="`echo "$meminfoline" | awk '{print $6}'`" local memcache="`echo "$meminfoline" | awk '{print $7}'`" local memprog=$(($memused-$membuf-$memcache)) local swaptotal="`echo "$swapinfoline" | awk '{print $2}'`" local swapused="`echo "$swapinfoline" | awk '{print $3}'`" echo "Memory: $memused / $memtotal MB (`printf %2d $(($memused*100/$memtotal))`%)" echo "Detail:" echo " Used: `printf %5d $memprog` MB (`printf %2d $(($memprog*100/$memtotal))`%)" echo " Buffers: `printf %5d $membuf` MB (`printf %2d $(($membuf*100/$memtotal))`%)" echo " Cached: `printf %5d $memcache` MB (`printf %2d $(($memcache*100/$memtotal))`%)" if [ "$swaptotal" = "0" ] then echo "Swap: not available" else echo "Swap: $swapused / $swaptotal MB (`printf %2d $(($swapused*100/$swaptotal))`%)" fi ;; *freebsd*|*FreeBSD*) local mempagesize="`sysctl -n hw.pagesize`" local mempagecount="`sysctl -n hw.availpages`" local memactive="`sysctl -n vm.stats.vm.v_active_count`" local meminactive="`sysctl -n vm.stats.vm.v_inactive_count`" local memwire="`sysctl -n vm.stats.vm.v_wire_count`" local memcache="`sysctl -n vm.stats.vm.v_cache_count`" local memfree="`sysctl -n vm.stats.vm.v_free_count`" local swapenabled="`sysctl -n vm.swap_enabled`" echo "Memory (Active): `printf %5d $(($memactive*$mempagesize/1048576))` MB (`printf %2d $(($memactive*100/$mempagecount))`%)" echo "Memory (Inactive): `printf %5d $(($meminactive*$mempagesize/1048576))` MB (`printf %2d $(($meminactive*100/$mempagecount))`%)" echo "Memory (Wired): `printf %5d $(($memwire*$mempagesize/1048576))` MB (`printf %2d $(($memwire*100/$mempagecount))`%)" echo "Memory (Cache): `printf %5d $(($memcache*$mempagesize/1048576))` MB (`printf %2d $(($memcache*100/$mempagecount))`%)" echo "Memory (Free): `printf %5d $(($memfree*$mempagesize/1048576))` MB (`printf %2d $(($memfree*100/$mempagecount))`%)" echo "Total Memory: `printf %5d $(($mempagecount*$mempagesize/1048576))` MB" if [ "$swapenabled" = "1" ]; then echo "" echo "Swap devices:" swapinfo -m else echo "Swap: not enabled" fi ;; *) echo "Unsupported operating system." ;; esac } # Tools: Packages ############################################################ function rpmdu () { local div_base=1 local div_name="KB" local total=0 if [ "`echo "$1" | cut -c 1`" = "-" ] then local optname=`echo "$1" | cut -c 2-` case "$optname" in "k") ;; "m") div_base=1024 div_name=MB ;; "g") div_base=1048576 div_name=GB ;; *) echo "Usage: $FUNCNAME [OPTION] package_name..." echo " -k KB" echo " -m MB" echo " -g GB" return 1 ;; esac shift fi while [ "$1" ] do rpm -ql "$1" | { while read oneline do if [ -f "$oneline" ] then du -k "$oneline" fi done } | { while read -d $'\t' filesize do total=$((${total}+${filesize})) read done printf "%9d %s %s\n" "$(($total/$div_base))" "$div_name" "$1" } shift done } function rpmsize () { local div_base=1 local div_name="Bytes" local total=0 local filesize if [ "`echo "$1" | cut -c 1`" = "-" ] then optname=`echo "$1" | cut -c 2-` case "$optname" in "b") ;; "k") div_base=1024 div_name=KB ;; "m") div_base=1048576 div_name=MB ;; "g") div_base=1073741824 div_name=GB ;; *) echo "Usage: $FUNCNAME [OPTION] package_name..." echo " -b Byte" echo " -k KB" echo " -m MB" echo " -g GB" return 1 ;; esac shift fi while [ "$1" ] do total=0 filesize=`rpm -q "$1" --queryformat "%{SIZE} "` for i in $filesize do total=$((${total}+${i})) done printf "%12d %s %s\n" "$(($total/$div_base))" "$div_name" "$1" shift done } function freebsd_ports_should_rebuild () { if [ -f "/var/db/pkg/local.sqlite" ]; then WITH_PKGNG="true" pkg_which_cmd="pkg which -q" else pkg_which_cmd="pkg_info -q -W" fi reqcomp=$(ldd -f '%a %o %p\n' \ /usr/local/bin/* /usr/local/sbin/* \ /usr/local/lib/* /usr/local/libexec/* \ /usr/local/libexec/*/* \ 2>/dev/null | safe_grep 'not found' | \ { while read oneline; do echo ${oneline} | cut -d ' ' -f 1; done; } | uniq) reqpkg=$({ for i in $reqcomp; do $pkg_which_cmd $i; done } | sort | uniq) echo $reqpkg } # Tools: Personal Files ###################################################### function check_important_files () { important_files="$HOME/.screenrc $HOME/.vimrc" for i in $important_files do [ '!' -f "$i" ] && printf "\e[1;31mWarning\e[m: \e[1;33m$i\e[m does not exist.\n" done } function prehistory_backup () { echo "Checking your current history file" local -i currentcount="`wc -l < "$HISTFILE"`" currentcount="${currentcount/ */}" [ '!' -f "$historycountfile" ] && touch "$historycountfile" local -i previoushistorycount="$(< "$historycountfile")" if [ "$currentcount" -lt "$previoushistorycount" ] then printf "\e[1;31mWarning\e[m: Your $HISTFILE may be TRUNCATED OR OVERWRITTEN BY OTHER PROGRAMS!\n" printf "Note: \e[1;33m$currentcount\e[m < $previoushistorycount\n" echo "Your $historycountfile and $historybackupfile will not be overwritten until this problem is fixed." echo " 1. Check your $HISTFILE." echo " 2. Edit your $HISTFILE manually if some unexpected changes are found." echo " (You may need $historybackupfile to do it) " echo " 3. Remove the file $historycountfile." echo " 4. Run the command \`prehistory_backup' again." return 3 fi echo -n "Backing up your current history file ($previoushistorycount -> $currentcount, " if [ "$previoushistorycount" = "$currentcount" ] then echo "no modification)" else echo "+$[$currentcount-$previoushistorycount])" fi echo "$currentcount" > "$historycountfile" safe_cp -f "$HISTFILE" "$historybackupfile" } # Tools: Programming ######################################################### function chr () { printf $(printf '\\%03o\\n' "$1") } function hex () { printf "0x%02x\n" "$1" } function ord () { printf "%d 0x%02x 0%03o\n" "'$1" "'$1" "'$1" } function argv0 () { local execname="$1" local argv0="$2" shift 2 ( exec -a "$argv0" "$execname" "$@" ) } function compile_all () { local noask=0 local mycc="${CC}" local mycxx="${CXX}" local myexe="`get_executable_extension`" local newCFLAGS local newCXXFLAGS local newLDFLAGS [ "$1" = '' ] && echo "Which file(s) do you want to compile? " && return 1 [ "$1" = "-n" ] && noask=1 if [ "$noask" = "0" ]; then read -e -p "CFLAGS: " -i "$CFLAGS" newCFLAGS read -e -p "CXXFLAGS: " -i "$CXXFLAGS" newCXXFLAGS read -e -p "LDFLAGS: " -i "$LDFLAGS" newLDFLAGS [ "$newCFLAGS" '!=' '' ] && CFLAGS=$newCFLAGS [ "$newCXXFLAGS" '!=' '' ] && CXXFLAGS=$newCXXFLAGS [ "$newLDFLAGS" '!=' '' ] && LDFLAGS=$newLDFLAGS else shift fi [ -z "${mycc}" ] && mycc=cc [ -z "${mycxx}" ] && mycxx=c++ while [ "$1" '!=' '' ] do local targetfile="`echo "$1" | sed 's|\(.*\)\..*|\1|'`$myexe" local suffix="`echo "$1" | sed 's|.*\.\(.*\)|\1|'`" if [ -f "$1" ]; then true else printf \ "\e[1;33mWarning\e[0m: $1 Non-existent file or not a regular file\n" shift ; continue fi [ "$targetfile" = "$1" ] && shift && continue case "$suffix" in c) echo "[${mycc}] $1 -> $targetfile" ${mycc} $CFLAGS "$1" $LDFLAGS -o "$targetfile" ;; cpp|CPP|cp|cxx|cc|c++|C) echo "[${mycxx}] $1 -> $targetfile" ${mycxx} $CXXFLAGS "$1" $LDFLAGS -o "$targetfile" ;; *) printf "$1: Unknown suffix (\e[1;33mskipped\e[0m)\n" ;; esac [ "$?" '!=' "0" ] && printf \ '\e[1;31mError\e[0m while compiling file\n' shift done return 0 } function cc_define () { local -i i local mycpp="${CPP}" if [ -z "${mycpp}" ]; then if [ -z "${CC}" ]; then mycpp="cpp" else mycpp="${CC} -E" fi fi split_arguments "$@" { (( i = 0 )) while [ "${prefixlist[$i]}" ]; do echo "#include <${prefixlist[$i]}>" (( i++ )) done (( i = 0 )) while [ "${arglist[$i]}" ]; do echo "${arglist[$i]}" (( i++ )) done } | ${mycpp} - | tail -n "${#arglist[@]}" unset arglist unset prefixlist } function cxx_define () { CPP="${CXXCPP}" CC="${CXX:-c++ -x c++}" cc_define "$@" } # Tools: Repeated Tasks ###################################################### function repeat () { local repeat_times="$1" shift for ((i=0; i&2 read -s -d R getsize echo $getsize | sed 's#..\([0-9]*\);\([0-9]*\)#LINES=\1 COLUMNS=\2#' } function set_terminal_size () { eval "export `get_terminal_size`" stty cols $COLUMNS rows $LINES } function set_console_title () { case "$TERM" in screen*) printf "\033]0;" echo -n "$*" printf "\033\\" ;; xterm*) printf "\033]0;" echo -n "$*" printf "\007" ;; *) echo "Your terminal may not have the hardstatus line." echo "Note: TERM=$TERM" ;; esac } # Tools: Web ################################################################# function convert_to_html () { while [ "$1" '!=' '' ] do for i in "$1" do vim $i -c 'set background=dark' \ -c 'highlight PreProc ctermfg=darkcyan' \ -c "$BEFORE_CONVERT_TO_HTML" \ -c "$BEFORE_CONVERT_TO_HTML1" \ -c "$BEFORE_CONVERT_TO_HTML2" \ -c TOhtml \ -c :w \ -c :qa done shift done } # Help alias helpf='help_function' alias helpm='help_myself' alias helpa='help_aliases' alias help_aliases='help_function' function print_iconv () { [ "$1" = "$2" ] && cat && return 0 iconv -f "$1" -t "$2" } function help_myself () { echo "argc = $#" echo "argv[0] = $0" i=1 while [ "$1" ] do echo "argv[$i] = $1" i=$(($i+1)) shift done } function help_function () { [ "$#" = "0" ] && { cat << "ENDHELPMSG" <<< Help >>> help_myself [arguments ...] (helpm) help_function [functions ...] (helpf) help_aliases (helpa) help_obsolete x print_iconv <<< Group: Background Tasks >>> bgrun command [arguments ...] (bgr) bglist [--full] (bgl, bgls) bgview [number] (bgv) bgclean [all | numbers ...] (bgrm) bgcount (bgc) bgdu <<< Group: Configuration Files >>> configfile_fetch [git_tag [file_name_list ...]] configfile_initial_setup x fetch_remote_file local_file_name remote_url x fetch_and_merge local_file_name remote_url <<< Group: New PATH Editor >>> path_editor [variable] ldpath_editor x newpath_init x newpath_gen <<< Group: Trash Manager >>> trash_mv [filenames ...] [-- sudo_prefix ...] (trash_put, trash_add) trash_ls (trash_list) trash_cd number trash_pushd number trash_recover numbers ... [-- sudo_prefix ...] (trash_restore, trash_rc) trash_rm numbers ... (trash_drop, trash_clean) trash_count (trash_ct) trash_du [-- sudo_prefix ...] <<< Tools: Background Notify Daemon >>> check_dmesg seconds check_system_status seconds <<< Tools: Backup >>> backup_file filename ... [-- sudo_prefix ...] <<< Tools: Compatibility >>> fbterm_chewing [size] [arguments ...] gen_ms_inet_shortcut filename url unzip_nomac filenames ... <<< Tools: GNU Screen >>> mkscreenacl usernames ... <<< Tools: Interactive >>> editlink filenames ... [-- sudo_prefix ...] mvfile [-n] filenames ... [-- sudo_prefix ...] varset variables ... <<< Tools: Memory >>> get_memory_info <<< Tools: Packages >>> rpmdu [-kmg] packages ... rpmsize [-bkmg] packages ... freebsd_ports_should_rebuild <<< Tools: Personal Files >>> check_important_files prehistory_backup <<< Tools: Programming >>> chr number hex number ord character argv0 executable arguments ... (include argv[0]) compile_all [-n] filenames ... cc_define macro [-- included_headers ...] cxx_define macro [-- included_headers ...] <<< Tools: Repeated Tasks >>> repeat times arguments ... wait_success arguments ... <<< Tools: Security >>> keep_sudo_credential [seconds] <<< Tools: Terminal >>> get_terminal_size set_terminal_size set_console_title <<< Tools: Web >>> convert_to_html filename ... <<< Shared Internal Functions >>> x createdir_askmode dirname x check_command_existent program x is_file_type filename type [-- sudo_prefix ...] x get_file_size filename [-- sudo_prefix ...] x get_executable_extension x split_arguments [arguments ...] <<< Aliases: Command Prompt >>> startcolor - Enable colorful PS1 prompting stopcolor - Disable colorful PS1 prompting <<< Aliases: Git >>> git_log - Show git log in a more compact format git_log_color - Show git log in a more colorful format <<< Aliases: GNU Screen >>> screen256 - Start GNU Screen and set TERM to screen-256color <<< Aliases: Language >>> big5 - Set Language and character sets to Taiwan Chinese Big5 cccc - Set Language and character sets to 7-bit ASCII enus - Set Language and character sets to US English UTF-8 zhtw - Set Language and character sets to Taiwan Chinese UTF-8 <<< Aliases: Nice Format >>> ndate - Format the output of `date' npasswd - Format the output of `getent passwd' ngroup - Format the output of `getent group' <<< Aliases: Terminal >>> savetty - Save current terminal mode resetty - Reset to last saved terminal mode <<< Aliases: Vim >>> vimhtml - Start Vim and set tabstop and shiftwidth to 2 ENDHELPMSG } | $PAGER && return 0 local current_charset=`echo "$LC_ALL" | cut -d . -f 2` local -i i while [ "$1" ] do case "$1" in help_myself|helpm) cat << "ENDHELPMSG" | print_iconv "UTF-8" "$current_charset" help_myself 一個測試命令列的小函式 ENDHELPMSG ;; help_function|helpf) cat << "ENDHELPMSG" | print_iconv "UTF-8" "$current_charset" help_function 顯示 .bash_include 提供的額外函式清單 註:前方加上「x」符號者表示此為內部使用的函式,不宜直接使用 ENDHELPMSG ;; bgrun|bgr) cat << "ENDHELPMSG" | print_iconv "UTF-8" "$current_charset" bgrun command [arguments ...] 執行指令 command 並將輸出導入檔案 註:此函式會自動以目前時間和指令名稱為檔案命名 ENDHELPMSG ;; bglist|bgl|bgls) cat << "ENDHELPMSG" | print_iconv "UTF-8" "$current_charset" bglist [--full] 列出所有使用 bgrun 執行的指令 若加上 --full 選項,則可同時察看時間 ENDHELPMSG ;; bgview|bgv) cat << "ENDHELPMSG" | print_iconv "UTF-8" "$current_charset" bgview [number] 顯示以 bgrun 執行指令的輸出,若省略 number,表示是最近一次執行的指令 若 number > 0, 表示第 number 個指令 (此數值可由 bglist 函式取得) 若 number <= 0, 表示第「指令總數-number」個指令 (指令總數可由 bgcount 函式取得) ENDHELPMSG ;; bgclean|bgrm) cat << "ENDHELPMSG" | print_iconv "UTF-8" "$current_charset" bgclean [all | numbers ...] bgclean all 可清除所有指令的輸出檔 bgclean 3 5 7 10 表示清除第 3、5、7、10 個指令輸出檔 (編號可由 bglist 取得) ENDHELPMSG ;; bgcount|bgc) cat << "ENDHELPMSG" | print_iconv "UTF-8" "$current_charset" bgcount 顯示指令輸出檔總數 ENDHELPMSG ;; bgdu) cat << "ENDHELPMSG" | print_iconv "UTF-8" "$current_charset" bgdu 顯示每個指令輸出檔的檔案大小 (單位:KB) ENDHELPMSG ;; *) echo "Help message for $1 is not found" ;; esac shift done } function help_obsolete () { cat << "ENDHELPMSG" @@@ Obsolete Group: PATH Editor @@@ old_path_editor old_ldpath_editor x old_path_editor_core x split_path x split_path_core x update_path ENDHELPMSG } # Doing something umask 0022 if [ "$interactive_shell" ] then echo "Running interactive shell configuration" check_important_files startcolor prehistory_backup bind '"\e[A":history-search-backward' bind '"\e[B":history-search-forward' if [ -e "$HOME/.bash_title" ]; then case "$TERM" in xterm*) PROMPT_COMMAND="$PROMPT_COMMAND"'; printf "\033]0;%s@%s:%s (%s)\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}" "`date "+%H:%M:%S"`"' ;; screen*) PROMPT_COMMAND="$PROMPT_COMMAND"'; printf "\033]0;%s@%s:%s (%s)\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}" "`date "+%H:%M:%S"`"' ;; esac fi [ "$TERM" = xterm ] && TERM=xterm-256color [ "$TERM" = screen ] && TERM=screen-256color fi [ "$interactive_shell" ] && echo "Setting shell options, completions, limits" shopt -s histappend shopt -s checkwinsize shopt -s checkjobs shopt -s checkhash shopt -s cmdhist shopt -s mailwarn complete -A alias helpa complete -A alias help_aliases complete -A command check_command_existent complete -A directory createdir_askmode complete -A function helpf complete -A function help_function complete -A variable varset complete -A variable path_editor complete -A user mkscreenacl if check_command_existent _command; then complete -F _command wait_success fi if check_command_existent _screen; then complete -F _screen screen256 fi if check_command_existent _rpmdev_installed_packages; then complete -F _rpmdev_installed_packages rpmdu complete -F _rpmdev_installed_packages rpmsize fi ulimit -S -c unlimited 2> /dev/null [ "$interactive_shell" ] && { if [ "$WINDOW" ] && type screen &> /dev/null; then if [ "`screen --version | sed 's/^Screen version 4\.\([0-9]*\).*$/\1/'`" -ge "1" ]; then echo "Setting options for GNU screen >= 4.1.0" screen -X cjkwidth off fi fi } [ "$interactive_shell" ] && { echo "Done" if [ "$UID" = "0" ] || [ "$EUID" = "0" ] then printf "\nNote: You may be \e[1;32mprivileged\e[m now!\n\n" fi }