📄 bashdb
字号:
#!/usr/bin/bash# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Rocky Bernstein # rockyb@users.sourceforge.net## Bash is free software; you can redistribute it and/or modify it under# the terms of the GNU General Public License as published by the Free# Software Foundation; either version 2, or (at your option) any later# version.## Bash is distributed in the hope that it will be useful, but WITHOUT ANY# WARRANTY; without even the implied warranty of MERCHANTABILITY or# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License# for more details.# # You should have received a copy of the GNU General Public License along# with Bash; see the file COPYING. If not, write to the Free Software# Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.## The alternate way to invoke debugger, "bash --debugger", has some# advantages: it sets $0 correctly and doesn't show this script in# the call trace. However the bash has been a bit inflexible and# quirky so sadly this script seems to be needed more than it would# normally.typeset _Dbg_ver=\'$Id: bashdb.in,v 1.20 2007/10/14 03:53:24 rockyb Exp $'_Dbg_usage_long() { printf "_Dbg_usage: ${_Dbg_pname} [OPTIONS] <script_file>Runs script_file under a debugger.options: -B | --basename basename only on source listings. (Needed in regression tests) -h | --help print this help -n | --nx |--no-init Don't run initialization files -c cmd | --command cmd Run this passed command as a script -q | --quiet Quiet. Do not print introductory and quiet messages. -L libdir | --library libdir set directory location of library helper file: $_Dbg_main The default directory is: $_Dbg_libdir -T tmpdir | --tempdir set directory location for temporary files: $_Dbg_tmpdir -t tty | --tty tty | --terminal tty set debugger terminal -x cmdfile | --cmdfile cmdfiles execute debugger commands from cmdfile -X | --trace set line tracing -V | --version show version number and no-warranty and exit.Long options may be abbreviated, e.g. --lib is okay for --library." 1>&2}_Dbg_usage_short() { printf "_Dbg_usage: ${_Dbg_pname} [OPTIONS] <script_file>Runs script_file under a debugger.options: -B basename only on source listings. (Needed in regression tests) -h print this help -n Don't run initialization files -c command Run this passed command as a script -q Quiet. Do not print introductory and quiet messages. -L libdir set directory location of library helper file: $_Dbg_main the default directory is: $_Dbg_libdir -T tmpdir set directory location for temporary files: $_Dbg_tmpdir -t tty set debugger terminal -x cmdfile execute debugger commands from cmdfile -X set line tracing -Y set line tracing with variable expansion -V show version number and no-warranty and exit." 1>&2}# This routine gets called via the -c or --command option and its sole# purpose is to capture the command string such as via "x $*" or # in a traceback ("where").bashdb_eval() { eval $* # Type: "x $*" to see what's being run.}declare -a _Dbg_script_args="$@"# Equivalent to basename $0; the short program nametypeset _Dbg_pname=${0##*/} # Show basename only in location listing. This is needed in regression teststypeset -i _Dbg_basename_only=${BASHDB_BASENAME_ONLY:-0}typeset _Dbg_main=dbg-main.incprefix=/usr/local # cygwin gets PKGDATADIR wrongtypeset _Dbg_libdir=${prefix}/share/bashdbtypeset _Dbg_bindir=$(dirname $0)typeset _Dbg_tmpdir=/tmptypeset -i _Dbg_opt_linetrace=0typeset _Dbg_cmd='' # If command string given on command line, this is it.# What to set for location of helper routines? if [[ ! -e $_Dbg_libdir/$_Dbg_main ]] ; then # Use bindir/../share as fallback _Dbg_libdir= if [[ -d $_Dbg_bindir/../share/bashdb ]] ; then _Dbg_libdir=$_Dbg_bindir/../share/bashdb fifi# Process using short or long options, depending on the availability# of getoptTEMP=`getopt -o testing t 2>/dev/null`if [ 1 = 1 ] && [ 0 = $? ] ; then # Process using long options # Note that we use `"$@"' to let each command-line parameter expand to a # separate word. The quotes around `$@' are essential! # We need TEMP as the `eval set --' would nuke the return value of getopt. TEMP=`getopt -o Bc:hL:nqt:T::x:XYV \--long basename,command:,debugger,help,library:,no-init,quiet,tempdir:,terminal:,trace,tty,version \ -n 'bashdb' -- "$@"` if [ $? != 0 ] ; then echo "Use --help for option help. Terminating..." >&2 ; exit 1 ; fi # Note the quotes around `$TEMP': they are essential! eval set -- "$TEMP" while true ; do case $1 in -B|--basename) _Dbg_basename_only=1 ;; -c|--command) _Dbg_cmd="$2"; shift ;; --debugger) ;; # This option is for compatibility with bash --debugger -h|--help) _Dbg_usage_long; exit 100 ;; -L|--library) _Dbg_libdir=$2; shift ;; -n|--nx|--no-init) _Dbg_no_init=1 ;; -q|--quiet) _Dbg_quiet=1 ;; -T|--tempdir) _Dbg_tmpdir=$2; shift ;; -t|--terminal|--tty) if ! $(touch $2 >/dev/null 2>/dev/null); then echo "${_Dbg_pname}: Can't access $2 for writing." elif [[ ! -w $2 ]] ; then echo "${_Dbg_pname}: terminal $2 needs to be writable." else _Dbg_tty=$2 ; fi shift ;; -x) BASHDB_INPUT="$BASHDB_INPUT $2"; shift ;; -X|--trace) _Dbg_opt_linetrace=1 ;; # -Y|--vtrace) _Dbg_opt_linetrace=1 ; _Dbg_opt_linetrace_expand=1 ;; -V|--version) show_version=1 ;; --) shift ; break ;; *) echo "Use --help for option help. Terminating..." exit 2 ;; esac shift doneelse # Process using short options while getopts :Bc:hL:nqt:T:x:XYV opt; do case $opt in B) _Dbg_basename_only=1 ;; c) _Dbg_cmd="$OPTARG" ;; h) _Dbg_usage_short; exit 100 ;; n) _Dbg_no_init=1 ;; q) _Dbg_quiet=1 ;; L) _Dbg_libdir=$OPTARG ;; T) _Dbg_tmpdir=$OPTARG ;; t) if ! $(touch $OPTARG >/dev/null 2>/dev/null); then echo "${_Dbg_pname}: Can't access $OPTARG for writing." elif [[ ! -w $OPTARG ]] ; then echo "${_Dbg_pname}: terminal $OPTARG needs to be writable." else _Dbg_tty=$OPTARG fi ;; V) show_version=1 ;; x) BASHDB_INPUT="$BASHDB_INPUT $OPTARG" ;; X) _Dbg_opt_linetrace=1 ;; # Y) _Dbg_opt_linetrace=1 ; _Dbg_opt_linetrace_expand=1 ;; *) if ((_Dbg_basename_only == 1)) ; then echo "${_Dbg_pname}: unrecognized option -- $OPTARG" else echo "$0: unrecognized option -- $OPTARG" fi echo "Use --help for option help. Terminating..." exit 2 ;; esac done shift $(($OPTIND - 1))fi[[ $# == 0 && -z $show_version && -z $_Dbg_cmd ]] && { echo "${_Dbg_pname}: Need to give a script name to debug." exit 1}if [[ ! -d $_Dbg_libdir ]] && [[ ! -d $_Dbg_libdir ]] ; then echo "${_Dbg_pname}: Can't read debugger library directory '${_Dbg_libdir}'." echo "${_Dbg_pname}: Perhaps bashdb is installed wrong (if its installed)." >&2 echo "${_Dbg_pname}: Try running bashdb using -L (with a different directory)." >&2 echo "${_Dbg_pname}: Run bashdb --help for a list and explanation of options." >&2 exit 1fi_source_file=$1shiftif [[ ! -d $_Dbg_tmpdir ]] && [[ ! -w $_Dbg_tmpdir ]] ; then echo "${_Dbg_pname}: cannot write to temp directory $_Dbg_tmpdir." >&2 echo "${_Dbg_pname}: Use -T try directory location." >&2 exit 1fi[[ -r $_Dbg_libdir/$_Dbg_main ]] || { echo "${_Dbg_pname}: cannot read debugger file $_Dbg_libdir/$_Dbg_main." >&2 echo "${_Dbg_pname}: Perhaps bashdb is installed incorrectly." >&2 exit 1}# Note that this is called via bashdb rather than "bash --debugger"_Dbg_script=1. ${_Dbg_libdir}/dbg-pre.incif [[ -z $_Dbg_quiet ]] ; then echo "Bourne-Again Shell Debugger, release $_Dbg_release" cat <<EOFCopyright 2002, 2003, 2004, 2006, 2007 Rocky BernsteinThis is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.EOFfiif (( show_version == 1 )) ; then cat <<EOFThere is absolutely no warranty for BASHDB. Type "show warranty" for details.EOF exit 1fiif [[ ! -r "$_source_file" ]] && [[ -z $_Dbg_cmd ]] ; then echo "${_Dbg_pname}: cannot read program to debug: $_source_file." >&2 exit 1else typeset -r _Dbg_source_file=$(_Dbg_expand_filename $_source_file)fi. $_Dbg_libdir/dbg-main.incif (( $_Dbg_opt_linetrace )) ; then # No stepping. _Dbg_write_journal_eval "_Dbg_steps=-1" BASHDB_QUIT_ON_QUIT=1else # Set to skip over the next 4 statements _Dbg_write_journal_eval "_Dbg_steps=5" fiset -o functraceif [[ -z $_Dbg_cmd ]] ; then if (( $_Dbg_opt_linetrace )) ; then (( _Dbg_opt_linetrace_expand )) && _Dbg_linetrace_expand=1 _Dbg_linetrace=1 fi . $_source_fileelse bashdb_eval "$_Dbg_cmd"fi# end of bashdb#;;; Local Variables: ***#;;; mode:shell-script ***#;;; eval: (sh-set-shell "bash") ***#;;; End: ***
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -