Пример I-1. Пример файла .bashrc

Пример I-1. Пример файла .bashrc

  1. #===============================================================
  2. #
  3. # ЛИЧНЫЙ ФАЙЛ $HOME/.bashrc для bash-2.05a (или выше)
  4. #
  5. # Время последней модификации: Втр Апр 15 20:32:34 CEST 2003
  6. #
  7. # Этот файл содержит настройки интерактивной командной оболочки.
  8. # Здесь размещены определения псевдонимов, функций
  9. # и других элементов Bash, таких как prompt (приглашение к вводу).
  10. #
  11. # Изначально, этот файл был создан в операционной системе Solaris,
  12. # но позднее был переделан под Redhat
  13. # --> Модифицирован под Linux.
  14. # Большая часть кода, который находится здесь, была взята из
  15. # Usenet (или Интернет).
  16. # Этот файл содержит слишком много определений — помните, это всего лишь пример.
  17. #
  18. #
  19. #===============================================================
  20. # --> Комментарии, добавленные автором HOWTO.
  21. # --> И дополнены автором сценария Emmanuel Rouat :-)
  22. #-----------------------------------
  23. # Глобальные определения
  24. #-----------------------------------
  25. if [ -f /etc/bashrc ]; then
  26.         . /etc/bashrc   # --> Прочитать настройки из /etc/bashrc, если таковой имеется.
  27. fi
  28. #-------------------------------------------------------------
  29. # Настройка переменной $DISPLAY (если еще не установлена)
  30. # Это срабатывает под linux - в вашем случае все может быть по другому....
  31. # Проблема в том, что различные типы терминалов
  32. # дают разные ответы на запрос 'who am i'......
  33. # я не нашел 'универсального' метода
  34. #-------------------------------------------------------------
  35. function get_xserver ()
  36. {
  37.     case $TERM in
  38.         xterm )
  39.             XSERVER=$(who am i | awk '{print $NF}' | tr -d ')''(' )
  40.             XSERVER=${XSERVER%%:*}
  41.             ;;
  42.         aterm | rxvt)
  43.         # добавьте здесь свой код.....
  44.             ;;
  45.     esac
  46. }
  47. if [ -z ${DISPLAY:=""} ]; then
  48.     get_xserver
  49.     if [[ -z ${XSERVER}  || ${XSERVER} == $(hostname) || ${XSERVER} == "unix" ]]; then
  50.         DISPLAY=":0.0"          # для локального хоста
  51.     else
  52.         DISPLAY=${XSERVER}:0.0  # для удаленного хоста
  53.     fi
  54. fi
  55. export DISPLAY
  56. #---------------
  57. # Некоторые настройки
  58. #---------------
  59. ulimit -S -c 0          # Запрет на создание файлов coredump
  60. set -o notify
  61. set -o noclobber
  62. set -o ignoreeof
  63. set -o nounset
  64. #set -o xtrace          # полезно для отладки
  65. # Разрешающие настройки:
  66. shopt -s cdspell
  67. shopt -s cdable_vars
  68. shopt -s checkhash
  69. shopt -s checkwinsize
  70. shopt -s mailwarn
  71. shopt -s sourcepath
  72. shopt -s no_empty_cmd_completion  # только для bash>=2.04
  73. shopt -s cmdhist
  74. shopt -s histappend histreedit histverify
  75. shopt -s extglob
  76. # Запрещающие настройки:
  77. shopt -u mailwarn
  78. unset MAILCHECK         # Я не желаю, чтобы командная оболочка сообщала мне о прибытии почты
  79. export TIMEFORMAT=$'\nreal %3R\tuser %3U\tsys %3S\tpcpu %P\n'
  80. export HISTIGNORE="&:bg:fg:ll:h"
  81. export HOSTFILE=$HOME/.hosts    # Поместить список удаленных хостов в файл ~/.hosts
  82. #-----------------------
  83. # Greeting, motd etc...
  84. #-----------------------
  85. # Для начала определить некоторые цвета:
  86. red='\e[0;31m'
  87. RED='\e[1;31m'
  88. blue='\e[0;34m'
  89. BLUE='\e[1;34m'
  90. cyan='\e[0;36m'
  91. CYAN='\e[1;36m'
  92. NC='\e[0m'              # No Color (нет цвета)
  93. # --> Прекрасно. Имеет тот же эффект, что и "ansi.sys" в DOS.
  94. # Лучше выглядит на черном фоне.....
  95. echo -e "${CYAN}This is BASH ${RED}${BASH_VERSION%.*}${CYAN} - DISPLAY on ${RED}$DISPLAY${NC}\n"
  96. date
  97. if [ -x /usr/games/fortune ]; then
  98.     /usr/games/fortune -s     # сделает наш день более интересным.... :-)
  99. fi
  100. function _exit()        # функция, запускающаяся при выходе из оболочки
  101. {
  102.     echo -e "${RED}Аста ла виста, бэби ${NC}"
  103. }
  104. trap _exit EXIT
  105. #---------------
  106. # Prompt
  107. #---------------
  108. if [[ "${DISPLAY#$HOST}" != ":0.0" &&  "${DISPLAY}" != ":0" ]]; then
  109.     HILIT=${red}   # на удаленной системе: prompt будет частично красным
  110. else
  111.     HILIT=${cyan}  # на локальной системе: prompt будет частично циановым
  112. fi
  113. #  --> Замените \W на \w в функциях ниже
  114. #+ --> чтобы видеть в оболочке полный путь к текущему каталогу.
  115. function fastprompt()
  116. {
  117.     unset PROMPT_COMMAND
  118.     case $TERM in
  119.         *term | rxvt )
  120.             PS1="${HILIT}[\h]$NC \W > \[\033]0;\${TERM} [\u@\h] \w\007\]" ;;
  121.         linux )
  122.             PS1="${HILIT}[\h]$NC \W > " ;;
  123.         *)
  124.             PS1="[\h] \W > " ;;
  125.     esac
  126. }
  127. function powerprompt()
  128. {
  129.     _powerprompt()
  130.     {
  131.         LOAD=$(uptime|sed -e "s/.*: \([^,]*\).*/\1/" -e "s/ //g")
  132.     }
  133.     PROMPT_COMMAND=_powerprompt
  134.     case $TERM in
  135.         *term | rxvt  )
  136.             PS1="${HILIT}[\A \$LOAD]$NC\n[\h \#] \W > \[\033]0;\${TERM} [\u@\h] \w\007\]" ;;
  137.         linux )
  138.             PS1="${HILIT}[\A - \$LOAD]$NC\n[\h \#] \w > " ;;
  139.         * )
  140.             PS1="[\A - \$LOAD]\n[\h \#] \w > " ;;
  141.     esac
  142. }
  143. powerprompt     # это prompt по-умолчанию - может работать довольно медленно
  144.                 # Если это так, то используйте fastprompt....
  145. #===============================================================
  146. #
  147. # ПСЕВДОНИМЫ И ФУНКЦИИ
  148. #
  149. # Возможно некоторые из функций, приведенных здесь, окажутся для вас слишком большими,
  150. # но на моей рабочей станции установлено 512Mb ОЗУ, так что.....
  151. # Если пожелаете уменьшить размер этого файла, то можете оформить эти функции
  152. # в виде отдельных сценариев.
  153. #
  154. # Большинство функций были взяты, почти без переделки, из примеров
  155. # к bash-2.04.
  156. #
  157. #===============================================================
  158. #-------------------
  159. # Псевдонимы
  160. #-------------------
  161. alias rm='rm -i'
  162. alias cp='cp -i'
  163. alias mv='mv -i'
  164. # -> Предотвращает случайное удаление файлов.
  165. alias mkdir='mkdir -p'
  166. alias h='history'
  167. alias j='jobs -l'
  168. alias r='rlogin'
  169. alias which='type -all'
  170. alias ..='cd ..'
  171. alias path='echo -e ${PATH//:/\\n}'
  172. alias print='/usr/bin/lp -o nobanner -d $LPDEST'   # Предполагается, что LPDEST определен
  173. alias pjet='enscript -h -G -fCourier9 -d $LPDEST'  # Печать через enscript
  174. alias background='xv -root -quit -max -rmode 5'    # Положить картинку в качестве фона
  175. alias du='du -kh'
  176. alias df='df -kTh'
  177. # Различные варианты 'ls' (предполагается, что установлена GNU-версия ls)
  178. alias la='ls -Al'               # показать скрытые файлы
  179. alias ls='ls -hF --color'       # выделить различные типы файлов цветом
  180. alias lx='ls -lXB'              # сортировка по расширению
  181. alias lk='ls -lSr'              # сортировка по размеру
  182. alias lc='ls -lcr'              # сортировка по времени изменения
  183. alias lu='ls -lur'              # сортировка по времени последнего обращения
  184. alias lr='ls -lR'               # рекурсивный обход подкаталогов
  185. alias lt='ls -ltr'              # сортировка по дате
  186. alias lm='ls -al |more'         # вывод через 'more'
  187. alias tree='tree -Csu'          # альтернатива 'ls'
  188. # подготовка 'less'
  189. alias more='less'
  190. export PAGER=less
  191. export LESSCHARSET='latin1'
  192. export LESSOPEN='|/usr/bin/lesspipe.sh %s 2>&-' # если существует lesspipe.sh
  193. export LESS='-i -N -w  -z-4 -g -e -M -X -F -R -P%t?f%f \
  194. :stdin .?pb%pb\%:?lbLine %lb:?bbByte %bb:-...'
  195. # проверка правописания - настоятельно рекомендую :-)
  196. alias xs='cd'
  197. alias vf='cd'
  198. alias moer='more'
  199. alias moew='more'
  200. alias kk='ll'
  201. #----------------
  202. # добавим немножко "приятностей"
  203. #----------------
  204. function xtitle ()
  205. {
  206.     case "$TERM" in
  207.         *term | rxvt)
  208.             echo -n -e "\033]0;$*\007" ;;
  209.         *)
  210.             ;;
  211.     esac
  212. }
  213. # псевдонимы...
  214. alias top='xtitle Processes on $HOST && top'
  215. alias make='xtitle Making $(basename $PWD) ; make'
  216. alias ncftp="xtitle ncFTP ; ncftp"
  217. # .. и функции
  218. function man ()
  219. {
  220.     for i ; do
  221.         xtitle The $(basename $1|tr -d .[:digit:]) manual
  222.         command man -F -a "$i"
  223.     done
  224. }
  225. function ll(){ ls -l "$@"| egrep "^d" ; ls -lXB "$@" 2>&-| egrep -v "^d|total "; }
  226. function te()  # "обертка" вокруг xemacs/gnuserv
  227. {
  228.     if [ "$(gnuclient -batch -eval t 2>&-)" == "t" ]; then
  229.         gnuclient -q "$@";
  230.     else
  231.         ( xemacs "$@" &);
  232.     fi
  233. }
  234. #-----------------------------------
  235. # Функции для работы с файлами и строками:
  236. #-----------------------------------
  237. # Поиск файла по шаблону:
  238. function ff() { find . -type f -iname '*'$*'*' -ls ; }
  239. # Поиск файла по шаблону в $1 и запуск команды в $2 с ним:
  240. function fe() { find . -type f -iname '*'$1'*' -exec "${2:-file}" {} \;  ; }
  241. # поиск строки по файлам:
  242. function fstr()
  243. {
  244.     OPTIND=1
  245.     local case=""
  246.     local usage="fstr: поиск строки в файлах.
  247. Порядок использования: fstr [-i] \"шаблон\" [\"шаблон_имени_файла\"] "
  248.     while getopts :it opt
  249.     do
  250.         case "$opt" in
  251.         i) case="-i " ;;
  252.         *) echo "$usage"; return;;
  253.         esac
  254.     done
  255.     shift $(( $OPTIND - 1 ))
  256.     if [ "$#" -lt 1 ]; then
  257.         echo "$usage"
  258.         return;
  259.     fi
  260.     local SMSO=$(tput smso)
  261.     local RMSO=$(tput rmso)
  262.     find . -type f -name "${2:-*}" -print0 | xargs -0 grep -sn ${case} "$1" 2>&- | \
  263. sed "s/$1/${SMSO}\0${RMSO}/gI" | more
  264. }
  265. function cuttail() # удалить последние n строк в файле, по-умолчанию 10
  266. {
  267.     nlines=${2:-10}
  268.     sed -n -e :a -e "1,${nlines}!{P;N;D;};N;ba" $1
  269. }
  270. function lowercase()  # перевести имя файла в нижний регистр
  271. {
  272.     for file ; do
  273.         filename=${file##*/}
  274.         case "$filename" in
  275.         */*) dirname==${file%/*} ;;
  276.         *) dirname=.;;
  277.         esac
  278.         nf=$(echo $filename | tr A-Z a-z)
  279.         newname="${dirname}/${nf}"
  280.         if [ "$nf" != "$filename" ]; then
  281.             mv "$file" "$newname"
  282.             echo "lowercase: $file --> $newname"
  283.         else
  284.             echo "lowercase: имя файла $file не было изменено."
  285.         fi
  286.     done
  287. }
  288. function swap()         # меняет 2 файла местами
  289. {
  290.     local TMPFILE=tmp.$$
  291.     mv "$1" $TMPFILE
  292.     mv "$2" "$1"
  293.     mv $TMPFILE "$2"
  294. }
  295. #-----------------------------------
  296. # Функции для работы с процессами/системой:
  297. #-----------------------------------
  298. function my_ps() { ps $@ -u $USER -o pid,%cpu,%mem,bsdtime,command ; }
  299. function pp() { my_ps f | awk '!/awk/ && $0~var' var=${1:-".*"} ; }
  300. # Эта функция является грубым аналогом 'killall' в linux
  301. # но не эквивалентна (насколько я знаю) 'killall' в Solaris
  302. function killps()   # "Прибить" процесс по его имени
  303. {
  304.     local pid pname sig="-TERM"   # сигнал, рассылаемый по-умолчанию
  305.     if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; then
  306.         echo "Порядок использования: killps [-SIGNAL] шаблон_имени_процесса"
  307.         return;
  308.     fi
  309.     if [ $# = 2 ]; then sig=$1 ; fi
  310.     for pid in $(my_ps| awk '!/awk/ && $0~pat { print $1 }' pat=${!#} ) ; do
  311.         pname=$(my_ps | awk '$1~var { print $5 }' var=$pid )
  312.         if ask "Послать сигнал $sig процессу $pid <$pname>?"
  313.             then kill $sig $pid
  314.         fi
  315.     done
  316. }
  317. function my_ip() # IP адрес
  318. {
  319.     MY_IP=$(/sbin/ifconfig ppp0 | awk '/inet/ { print $2 } ' | sed -e s/addr://)
  320.     MY_ISP=$(/sbin/ifconfig ppp0 | awk '/P-t-P/ { print $3 } ' | sed -e s/P-t-P://)
  321. }
  322. function ii()   # Дополнительные сведения о системе
  323. {
  324.     echo -e "\nВы находитесь на ${RED}$HOST"
  325.     echo -e "\nДополнительная информация:$NC " ; uname -a
  326.     echo -e "\n${RED}В системе работают пользователи:$NC " ; w -h
  327.     echo -e "\n${RED}Дата:$NC " ; date
  328.     echo -e "\n${RED}Время, прошедшее с момента последней перезагрузки :$NC " ; uptime
  329.     echo -e "\n${RED}Память :$NC " ; free
  330.     my_ip 2>&- ;
  331.     echo -e "\n${RED}IP адрес:$NC" ; echo ${MY_IP:-"Соединение не установлено"}
  332.     echo -e "\n${RED}Адрес провайдера (ISP):$NC" ; echo ${MY_ISP:-"Соединение не установлено"}
  333.     echo
  334. }
  335. # Разные утилиты:
  336. function repeat()       # повторить команду n раз
  337. {
  338.     local i max
  339.     max=$1; shift;
  340.     for ((i=1; i <= max ; i++)); do  # --> C-подобный синтаксис
  341.         eval "$@";
  342.     done
  343. }
  344. function ask()
  345. {
  346.     echo -n "$@" '[y/n] ' ; read ans
  347.     case "$ans" in
  348.         y*|Y*) return 0 ;;
  349.         *) return 1 ;;
  350.     esac
  351. }
  352. #=========================================================================
  353. #
  354. # ПРОГРАММНЫЕ ДОПОЛНЕНИЯ - ТОЛЬКО НАЧИНАЯ С ВЕРСИИ BASH-2.04
  355. # Большая часть дополнений взята из докуентации к bash 2.05  и из
  356. # пакета 'Bash completion' (<a href="http://www.caliban.org/bash/index.shtml#completion" title="http://www.caliban.org/bash/index.shtml#completion">http://www.caliban.org/bash/index.shtml#completion</a>)
  357. # автор — Ian McDonalds
  358. # Фактически, у вас должен стоять bash-2.05a
  359. #
  360. #=========================================================================
  361. if [ "${BASH_VERSION%.*}" \< "2.05" ]; then
  362.     echo "Вам необходимо обновиться до версии 2.05"
  363.     return
  364. fi
  365. shopt -s extglob        # необходимо
  366. set +o nounset          # иначе некоторые дополнения не будут работать
  367. complete -A hostname   rsh rcp telnet rlogin r ftp ping disk
  368. complete -A export     printenv
  369. complete -A variable   export local readonly unset
  370. complete -A enabled    builtin
  371. complete -A alias      alias unalias
  372. complete -A function   function
  373. complete -A user       su mail finger
  374. complete -A helptopic  help
  375. complete -A shopt      shopt
  376. complete -A stopped -P '%' bg
  377. complete -A job -P '%'     fg jobs disown
  378. complete -A directory  mkdir rmdir
  379. complete -A directory   -o default cd
  380. # Архивация
  381. complete -f -o default -X '*.+(zip|ZIP)'  zip
  382. complete -f -o default -X '!*.+(zip|ZIP)' unzip
  383. complete -f -o default -X '*.+(z|Z)'      compress
  384. complete -f -o default -X '!*.+(z|Z)'     uncompress
  385. complete -f -o default -X '*.+(gz|GZ)'    gzip
  386. complete -f -o default -X '!*.+(gz|GZ)'   gunzip
  387. complete -f -o default -X '*.+(bz2|BZ2)'  bzip2
  388. complete -f -o default -X '!*.+(bz2|BZ2)' bunzip2
  389. # Postscript,pdf,dvi.....
  390. complete -f -o default -X '!*.ps'  gs ghostview ps2pdf ps2ascii
  391. complete -f -o default -X '!*.dvi' dvips dvipdf xdvi dviselect dvitype
  392. complete -f -o default -X '!*.pdf' acroread pdf2ps
  393. complete -f -o default -X '!*.+(pdf|ps)' gv
  394. complete -f -o default -X '!*.texi*' makeinfo texi2dvi texi2html texi2pdf
  395. complete -f -o default -X '!*.tex' tex latex slitex
  396. complete -f -o default -X '!*.lyx' lyx
  397. complete -f -o default -X '!*.+(htm*|HTM*)' lynx html2ps
  398. # Multimedia
  399. complete -f -o default -X '!*.+(jp*g|gif|xpm|png|bmp)' xv gimp
  400. complete -f -o default -X '!*.+(mp3|MP3)' mpg123 mpg321
  401. complete -f -o default -X '!*.+(ogg|OGG)' ogg123
  402. complete -f -o default -X '!*.pl'  perl perl5
  403. # Эти 'универсальные' дополнения работают тогда, когда команды вызываются
  404. # с, так называемыми, 'длинными ключами', например: 'ls --all' вместо 'ls -a'
  405. _get_longopts ()
  406. {
  407.     $1 --help | sed  -e '/--/!d' -e 's/.*--\([^[:space:].,]*\).*/--\1/'| \
  408. grep ^"$2" |sort -u ;
  409. }
  410. _longopts_func ()
  411. {
  412.     case "${2:-*}" in
  413.         -*)     ;;
  414.         *)      return ;;
  415.     esac
  416.     case "$1" in
  417.         \~*)    eval cmd="$1" ;;
  418.         *)      cmd="$1" ;;
  419.     esac
  420.     COMPREPLY=( $(_get_longopts ${1} ${2} ) )
  421. }
  422. complete  -o default -F _longopts_func configure bash
  423. complete  -o default -F _longopts_func wget id info a2ps ls recode
  424. _make_targets ()
  425. {
  426.     local mdef makef gcmd cur prev i
  427.     COMPREPLY=()
  428.     cur=${COMP_WORDS[COMP_CWORD]}
  429.     prev=${COMP_WORDS[COMP_CWORD-1]}
  430.     # Если аргумент prev это -f, то вернуть возможные варианты имен файлов.
  431.     # будем великодушны и вернем несколько вариантов
  432.     # `makefile Makefile *.mk'
  433.     case "$prev" in
  434.         -*f)    COMPREPLY=( $(compgen -f $cur ) ); return 0;;
  435.     esac
  436.     # Если запрошены возможные ключи, то вернуть ключи posix
  437.     case "$cur" in
  438.         -)      COMPREPLY=(-e -f -i -k -n -p -q -r -S -s -t); return 0;;
  439.     esac
  440.     # попробовать передать make `makefile' перед тем как попробовать передать `Makefile'
  441.     if [ -f makefile ]; then
  442.         mdef=makefile
  443.     elif [ -f Makefile ]; then
  444.         mdef=Makefile
  445.     else
  446.         mdef=*.mk
  447.     fi
  448.     # прежде чем просмотреть "цели", убедиться, что имя makefile было задано
  449.     # ключом -f
  450.     for (( i=0; i < ${#COMP_WORDS[@]}; i++ )); do
  451.         if [[ ${COMP_WORDS[i]} == -*f ]]; then
  452.             eval makef=${COMP_WORDS[i+1]}
  453.             break
  454.         fi
  455.     done
  456.         [ -z "$makef" ] && makef=$mdef
  457.     # Если задан шаблон поиска, то ограничиться
  458.     # этим шаблоном
  459.     if [ -n "$2" ]; then gcmd='grep "^$2"' ; else gcmd=cat ; fi
  460.     # если мы не желаем использовать *.mk, то необходимо убрать cat и использовать
  461.     # test -f $makef с перенаправлением ввода
  462.     COMPREPLY=( $(cat $makef 2>/dev/null | awk 'BEGIN {FS=":"} /^[^.#   ][^=]*:/ {print $1}' | tr -s ' ' '\012' | sort -u | eval $gcmd ) )
  463. }
  464. complete -F _make_targets -X '+($*|*.[cho])' make gmake pmake
  465. # cvs(1) completion
  466. _cvs ()
  467. {
  468.     local cur prev
  469.     COMPREPLY=()
  470.     cur=${COMP_WORDS[COMP_CWORD]}
  471.     prev=${COMP_WORDS[COMP_CWORD-1]}
  472.     if [ $COMP_CWORD -eq 1 ] || [ "${prev:0:1}" = "-" ]; then
  473.         COMPREPLY=( $( compgen -W 'add admin checkout commit diff \
  474.        export history import log rdiff release remove rtag status \
  475.        tag update' $cur ))
  476.     else
  477.         COMPREPLY=( $( compgen -f $cur ))
  478.     fi
  479.     return 0
  480. }
  481. complete -F _cvs cvs
  482. _killall ()
  483. {
  484.     local cur prev
  485.     COMPREPLY=()
  486.     cur=${COMP_WORDS[COMP_CWORD]}
  487.     # получить список процессов
  488.     COMPREPLY=( $( /usr/bin/ps -u $USER -o comm  | \
  489.         sed -e '1,1d' -e 's#[]\[]##g' -e 's#^.*/##'| \
  490.         awk '{if ($0 ~ /^'$cur'/) print $0}' ))
  491.     return 0
  492. }
  493. complete -F _killall killall killps
  494. # Функция обработки мета-команд
  495. # В настоящее время недостаточно отказоустойчива (например, mount и umount
  496. # обрабатываются некорректно), но все еще актуальна. Автор Ian McDonald, изменена мной.
  497. _my_command()
  498. {
  499.     local cur func cline cspec
  500.     COMPREPLY=()
  501.     cur=${COMP_WORDS[COMP_CWORD]}
  502.     if [ $COMP_CWORD = 1 ]; then
  503.         COMPREPLY=( $( compgen -c $cur ) )
  504.     elif complete -p ${COMP_WORDS[1]} &>/dev/null; then
  505.         cspec=$( complete -p ${COMP_WORDS[1]} )
  506.         if [ "${cspec%%-F *}" != "${cspec}" ]; then
  507.             # complete -F <function>
  508.             #
  509.             # COMP_CWORD and COMP_WORDS() доступны на запись,
  510.             # так что мы можем установить их перед тем,
  511.             # как передать их дальше
  512.             # уменьшить на 1 текущий номер лексемы
  513.             COMP_CWORD=$(( $COMP_CWORD - 1 ))
  514.             # получить имя функции
  515.             func=${cspec#*-F }
  516.             func=${func%% *}
  517.             # получить командную строку, исключив первую команду
  518.             cline="${COMP_LINE#$1 }"
  519.             # разбить на лексемы и поместить в массив
  520.                 COMP_WORDS=( $cline )
  521.             $func $cline
  522.         elif [ "${cspec#*-[abcdefgjkvu]}" != "" ]; then
  523.             # complete -[abcdefgjkvu]
  524.             #func=$( echo $cspec | sed -e 's/^.*\(-[abcdefgjkvu]\).*$/\1/' )
  525.             func=$( echo $cspec | sed -e 's/^complete//' -e 's/[^ ]*$//' )
  526.             COMPREPLY=( $( eval compgen $func $cur ) )
  527.         elif [ "${cspec#*-A}" != "$cspec" ]; then
  528.             # complete -A <type>
  529.             func=${cspec#*-A }
  530.         func=${func%% *}
  531.         COMPREPLY=( $( compgen -A $func $cur ) )
  532.         fi
  533.     else
  534.         COMPREPLY=( $( compgen -f $cur ) )
  535.     fi
  536. }
  537. complete -o default -F _my_command nohup exec eval trace truss strace sotruss gdb
  538. complete -o default -F _my_command command type which man nice
  539. # Локальные переменные:
  540. # mode:shell-script
  541. # sh-shell:bash
  542. # Конец: