summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorJari Aalto <jari.aalto@cante.net>1996-08-26 18:22:31 +0000
committerJari Aalto <jari.aalto@cante.net>2009-09-12 16:46:49 +0000
commit726f63884db0132f01745f1fb4465e6621088ccf (patch)
tree6c2f7765a890a97e0e513cb539df43283a8f7c4d /examples
downloadbash-726f63884db0132f01745f1fb4465e6621088ccf.tar.gz
Imported from ../bash-1.14.7.tar.gz.
Diffstat (limited to 'examples')
-rwxr-xr-xexamples/alias-conv.sh22
-rw-r--r--examples/functions/autoload103
-rw-r--r--examples/functions/basename23
-rw-r--r--examples/functions/csh-compat36
-rw-r--r--examples/functions/dirfuncs142
-rw-r--r--examples/functions/dirname21
-rw-r--r--examples/functions/exitstat22
-rw-r--r--examples/functions/external50
-rw-r--r--examples/functions/fact13
-rw-r--r--examples/functions/fstty59
-rw-r--r--examples/functions/func27
-rw-r--r--examples/functions/jj.bash12
-rw-r--r--examples/functions/kshenv183
-rw-r--r--examples/functions/manpage129
-rw-r--r--examples/functions/notify.bash58
-rw-r--r--examples/functions/shcat7
-rw-r--r--examples/functions/substr79
-rw-r--r--examples/functions/substr281
-rw-r--r--examples/functions/term35
-rw-r--r--examples/functions/whatis52
-rw-r--r--examples/functions/whence59
-rwxr-xr-xexamples/scripts/adventure.sh545
-rw-r--r--examples/scripts/bcsh.sh1254
-rw-r--r--examples/scripts/precedence75
-rwxr-xr-xexamples/scripts/shprompt137
-rw-r--r--examples/startup-files/Bash_aliases63
-rw-r--r--examples/startup-files/Bash_profile20
-rw-r--r--examples/startup-files/Bashrc72
-rw-r--r--examples/startup-files/bash-profile54
-rw-r--r--examples/startup-files/bashrc139
-rw-r--r--examples/suncmd.termcap30
31 files changed, 3602 insertions, 0 deletions
diff --git a/examples/alias-conv.sh b/examples/alias-conv.sh
new file mode 100755
index 00000000..edbed865
--- /dev/null
+++ b/examples/alias-conv.sh
@@ -0,0 +1,22 @@
+#! /bin/sh
+#
+# Convert Csh aliases to Bash aliases. Adapted from a similar program
+# supplied with zsh.
+#
+# This is a quick script to convert csh aliases to Bash aliases/functions.
+# Pipe the output of csh's alias command through this; it will generate
+# a series of alias/function definitions on stdout, suitable for
+# processing by bash.
+#
+# This is not perfect, but it gets most common aliases; it should manage to
+# cut down a lot of the busy work.
+#
+sed -e 's/ (\(.*\))/ \1/' >/tmp/cz$$.1
+grep ! /tmp/cz$$.1 >/tmp/cz$$.2
+grep -v ! /tmp/cz$$.1 >/tmp/cz$$.3
+sed -e "s/'/'"\\\\"''"/g -e 's/^\([^ ]*\) \(.*\)$/alias \1='"'\2'/" \
+ /tmp/cz$$.3
+sed -e 's/![:#]*/$/g' -e 's/^\([^ ]*\) \(.*\)$/\1 () { \2 }/' /tmp/cz$$.2
+rm /tmp/cz$$.?
+
+exit 0
diff --git a/examples/functions/autoload b/examples/functions/autoload
new file mode 100644
index 00000000..a6ae4215
--- /dev/null
+++ b/examples/functions/autoload
@@ -0,0 +1,103 @@
+#
+# An almost ksh-compatible `autoload'. A function declared as `autoload' will
+# be read in from a file the same name as the function found by searching the
+# $FPATH (which works the same as $PATH), then that definition will be run.
+#
+# To do this without source support, we define a dummy function that, when
+# executed, will load the file (thereby re-defining the function), then
+# execute that newly-redefined function with the original arguments.
+#
+# It's not identical to ksh because ksh apparently does lazy evaluation
+# and looks for the file to load from only when the function is referenced.
+# This one requires that the file exist when the function is declared as
+# `autoload'.
+#
+# usage: autoload func [func...]
+#
+# The first cut of this was by Bill Trost, trost@reed.bitnet
+#
+# Chet Ramey
+# chet@ins.CWRU.Edu
+
+#
+# Declare a function ($1) to be autoloaded from a file ($2) when it is first
+# called. This defines a `temporary' function that will `.' the file
+# containg the real function definition, then execute that new definition with
+# the arguments given to this `fake' function. The autoload function defined
+# by the file and the file itself *must* be named identically.
+#
+
+aload()
+{
+ eval $1 '() { . '$2' ; '$1' "$@" ; return $?; }'
+}
+
+#
+# Search $FPATH for a file the same name as the function given as $1, and
+# autoload the function from that file. There is no default $FPATH.
+#
+
+autoload()
+{
+ #
+ # Save the list of functions; we're going to blow away the arguments
+ # in a second. If any of the names contain white space, TFB.
+ #
+
+ local args="$*"
+
+ #
+ # This should, I think, list the functions marked as autoload and not
+ # yet defined, but we don't have enough information to do that here.
+ #
+ if [ $# -eq 0 ] ; then
+ echo "usage: autoload function [function...]"
+ return 1
+ fi
+
+ #
+ # If there is no $FPATH, there is no work to be done
+ #
+
+ if [ -z "$FPATH" ] ; then
+ echo autoload: FPATH not set
+ return 1
+ fi
+
+ #
+ # This treats FPATH exactly like PATH: a null field anywhere in the
+ # FPATH is treated the same as the current directory.
+ #
+ # The path splitting command is taken from Kernighan and Pike
+ #
+
+ fp=$(echo $FPATH | sed 's/^:/.:/
+ s/::/:.:/g
+ s/:$/:./
+ s/:/ /g')
+
+ for FUNC in $args ; do
+ #
+ # We're blowing away the arguments to autoload here...
+ # We have to; there are no arrays.
+ #
+ set $fp
+
+ while [ $# -ne 0 ] ; do
+ if [ -f $1/$FUNC ] ; then
+ break # found it!
+ fi
+ shift
+ done
+
+ if [ $# -eq 0 ] ; then
+ echo "$FUNC: autoload function not found"
+ continue
+ fi
+
+# echo auto-loading $FUNC from $1/$FUNC
+ aload $FUNC $1/$FUNC
+ done
+
+ return 0
+}
diff --git a/examples/functions/basename b/examples/functions/basename
new file mode 100644
index 00000000..a5413495
--- /dev/null
+++ b/examples/functions/basename
@@ -0,0 +1,23 @@
+# Date: Fri, 11 Oct 91 11:22:36 edt
+# From: friedman@gnu.ai.mit.edu
+# To: bfox@gnu.ai.mit.edu
+
+# A replacement for basename(1). Not all the systems I use have this
+# program. Usage: basename [path] {extension}
+function basename ()
+{
+ local path="$1"
+ local suffix="$2"
+ local tpath="${path%/}"
+
+ # Strip trailing '/' characters from path (unusual that this should
+ # ever occur, but basename(1) seems to deal with it.)
+ while [ "${tpath}" != "${path}" ]; do
+ tpath="${path}"
+ path="${tpath%/}"
+ done
+
+ path="${path##*/}" # Strip off pathname
+ echo ${path%${suffix}} # Also strip off extension, if any.
+}
+
diff --git a/examples/functions/csh-compat b/examples/functions/csh-compat
new file mode 100644
index 00000000..8eaf7545
--- /dev/null
+++ b/examples/functions/csh-compat
@@ -0,0 +1,36 @@
+# C-shell compatabilty package.
+# setenv VAR VALUE
+function setenv () {
+ export $1="$2"
+}
+
+function unsetenv () {
+ unset $1
+}
+
+function alias () {
+ local name=$1
+ shift
+ local value="$*"
+
+ if [ "$name" = "" ]; then
+ builtin alias
+ elif [ "$value" = "" ]; then
+ builtin alias $name
+ else
+ builtin alias $name="$value"
+ fi
+}
+
+# Can't write foreach yet. Need pattern matching, and a few extras.
+function foreach () {
+echo 'Can'\''t do `foreach'\'' yet. Type "help for".'
+}
+
+# Make this work like csh's. Special case "term" and "path".
+#set () {
+#}
+
+chdir () {
+ builtin cd $*
+ }
diff --git a/examples/functions/dirfuncs b/examples/functions/dirfuncs
new file mode 100644
index 00000000..3958bbec
--- /dev/null
+++ b/examples/functions/dirfuncs
@@ -0,0 +1,142 @@
+#
+# Directory manipulation functions from the book 'The Korn Shell'
+# Modified for use with bash Mon Apr 18 08:37 1994 by
+# Ken Konecki (kenk@wfg.com)
+#
+# Modified by Chet Ramey
+#
+# This could stand to have calls to `select' added back in
+#
+
+alias integer="declare -i"
+
+integer _push_max=${CDSTACK-31} _push_top=${CDSTACK-31}
+
+unalias cd
+# alias cd=_cd
+
+# Display directory stack -- $HOME display as ~
+dirs()
+{
+ dir="${PWD#$HOME/}"
+ case $dir in
+ $HOME) dir=\~ ;;
+ /*) ;;
+ *) dir=\~/$dir ;;
+ esac
+
+ integer i=_push_top
+ integer n=1
+
+ echo "$n) $dir"
+ while let "i < $_push_max"
+ do
+ n=n+1
+ eval "echo \$n\) \$_push_stack_$i"
+ i=i+1
+ done
+}
+
+# Change directory and put directory on front of stack
+cd()
+{
+ typeset dir=
+ integer n=0 type=4 i
+ case $1 in
+ -|-1|2) # cd -
+ n=_push_top type=1
+ ;;
+ -[1-9]|-[1-9][0-9]) # cd -n
+ n=_push_top+${1#-}-1 type=2
+ ;;
+
+ 1) # keep present directory
+ echo "$PWD"
+ return
+ ;;
+
+ [2-9]|[1-9][0-9]) # cd n
+ n=_push_top+${1}-2 type=2
+ ;;
+
+ *)
+ if let "_push_top <= 0"; then
+ type=3 n=_push_max
+ fi
+ ;;
+ esac
+
+ if let "type < 3"; then
+ if let "n >= _push_max"; then
+ echo cd: Directory stack not that deep
+ return 1
+ else
+ eval dir=\${_push_stack_$n}
+ fi
+ fi
+
+ case $dir in
+ ~*) dir=$HOME${dir#\~} ;;
+ esac
+
+ cd2 ${dir:-$@} > /dev/null || return 1
+ dir=${OLDPWD#$HOME/}
+ case $dir in
+ $HOME) dir=\~ ;;
+ /*) ;;
+ *) dir=\~/$dir ;;
+ esac
+
+ case $type in
+ 1) # swap first two elements
+ eval _push_stack_$_push_top=\$dir ;;
+
+ 2|3) # put $dir on top and shift down by one until top
+ i=_push_top
+ unset _dirlist
+ while let "i < $_push_max" ; do
+ eval _dirlist=\"\$_dirlist \$_push_stack_$i\"
+ i=i+1
+ done
+
+ i=_push_top
+ for dir in "$dir" ${_dirlist} ; do
+ let "i > n" && break
+ eval _push_stack_$i=\$dir
+ i=i+1
+ done
+ ;;
+ 4) # push name
+ _push_top=_push_top-1;
+ eval _push_stack_$_push_top=\$dir
+ ;;
+ esac
+
+ echo "$PWD"
+
+}
+
+# Menu-driven change directory command
+function mcd
+{
+ dirs
+ echo -n "Select by number or enter a name: "
+ read
+ cd $REPLY
+}
+
+
+# Emulate ksh cd substitution
+cd2()
+{
+ case "$#" in
+ 0) builtin cd "$HOME" ;;
+ 1) builtin cd "$1" ;;
+ 2) newDir=$(echo $PWD | sed -e "s:$1:$2:g")
+ case "$newDir" in
+ $PWD) echo "bash:: cd: bad substitution" >&2 ; return 1 ;;
+ *) builtin cd "$newDir" ;;
+ esac ;;
+ *) echo "bash: cd: wrong arg count" 1>&2 ; return 1 ;;
+ esac
+}
diff --git a/examples/functions/dirname b/examples/functions/dirname
new file mode 100644
index 00000000..ccb8c841
--- /dev/null
+++ b/examples/functions/dirname
@@ -0,0 +1,21 @@
+# Date: Fri, 11 Oct 91 11:22:36 edt
+# From: friedman@gnu.ai.mit.edu
+# To: bfox@gnu.ai.mit.edu
+
+# A replacement for dirname(1). This one appears less often on some
+# systems I use than basename(1), and I really depend on it for some
+# things. Usage: dirname [path]
+function dirname ()
+{
+ local dir="$1"
+ local tdir="${dir%/}"
+
+ # Strip trailing '/' characters from dir (unusual that this should
+ # ever occur, but dirname(1) seems to deal with it.)
+ while [ "${tdir}" != "${dir}" ]; do
+ tdir="${dir}"
+ dir="${tdir%/}"
+ done
+
+ echo "${dir%/*}"
+}
diff --git a/examples/functions/exitstat b/examples/functions/exitstat
new file mode 100644
index 00000000..bae3f271
--- /dev/null
+++ b/examples/functions/exitstat
@@ -0,0 +1,22 @@
+# Contributed by Noah Friedman and Roland McGrath.
+
+# To be run by the PROMPT_COMMAND variable, so that one can see what
+# the exit status of processes are.
+
+function check_exit_status ()
+{
+ local status="$?"
+ local signal=""
+
+ if [ ${status} -ne 0 -a ${status} != 128 ]; then
+ # If process exited by a signal, determine name of signal.
+ if [ ${status} -gt 128 ]; then
+ signal="$(builtin kill -l $[${status} - 128] 2>/dev/null)"
+ if [ "$signal" ]; then signal="($signal)"; fi
+ fi
+ echo "[Exit ${status} ${signal}]" 1>&2
+ fi
+ return 0
+}
+
+PROMPT_COMMAND=check_exit_status
diff --git a/examples/functions/external b/examples/functions/external
new file mode 100644
index 00000000..c2e52cdd
--- /dev/null
+++ b/examples/functions/external
@@ -0,0 +1,50 @@
+# Contributed by Noah Friedman.
+
+# To avoid using a function in bash, you can use the `builtin' or
+# `command' builtins, but neither guarantees that you use an external
+# program instead of a bash builtin if there's a builtin by that name. So
+# this function can be used like `command' except that it guarantees the
+# program is external by first disabling any builtin by that name. After
+# the command is done executing, the state of the builtin is restored.
+function external ()
+{
+ local state=""
+ local exit_status
+
+ if builtin_p "$1"; then
+ state="builtin"
+ enable -n "$1"
+ fi
+
+ command "$@"
+ exit_status=$?
+
+ if [ "$state" = "builtin" ]; then
+ enable "$1"
+ fi
+
+ return ${exit_status}
+}
+
+# What is does is tell you if a particular keyword is currently enabled as
+# a shell builtin. It does NOT tell you if invoking that keyword will
+# necessarily run the builtin. For that, do something like
+#
+# test "$(builtin type -type [keyword])" = "builtin"
+#
+# Note also, that disabling a builtin with "enable -n" will make builtin_p
+# return false, since the builtin is no longer available.
+function builtin_p ()
+{
+ local word
+
+ set $(builtin type -all -type "$1")
+
+ for word in "$@" ; do
+ if [ "${word}" = "builtin" ]; then
+ return 0
+ fi
+ done
+
+ return 1
+}
diff --git a/examples/functions/fact b/examples/functions/fact
new file mode 100644
index 00000000..cd7bf467
--- /dev/null
+++ b/examples/functions/fact
@@ -0,0 +1,13 @@
+# Who said shells can't use recursion? Here is a factorial function.
+# You call it with a number as an argument, and it returns the factorial
+# of that number.
+
+fact ()
+{
+ local num=$1;
+ if [ "$num" = 1 ] ; then
+ echo 1
+ return ;
+ fi;
+ echo $[ $num * $(fact $[ $num - 1 ])]
+}
diff --git a/examples/functions/fstty b/examples/functions/fstty
new file mode 100644
index 00000000..a770d841
--- /dev/null
+++ b/examples/functions/fstty
@@ -0,0 +1,59 @@
+#
+# A function that works as a front end for both stty and the `bind'
+# builtin, so the tty driver and readline see the same changes
+#
+
+#
+# Convert between the stty ^H control character form and the readline \C-H
+# form
+#
+cvt()
+{
+ echo "$@" | cat -v | sed 's/\^/\\C-/'
+}
+
+#
+# stty front-end. Parses the argument list and creates two command strings,
+# one for stty, another for bind.
+#
+fstty()
+{
+ local cmd="" bargs=""
+ local e
+
+ while [ $# -gt 0 ]
+ do
+ case "$1" in
+ -a) cmd="$cmd everything"
+ ;;
+ erase) shift;
+ e=$(cvt "$1")
+ cmd="$cmd erase $1"
+ bargs="$bargs '\"$e\": backward-delete-char'"
+ ;;
+ kill) shift
+ e=$(cvt "$1")
+ cmd="$cmd kill $1"
+ bargs="$bargs '\"$e\": unix-line-discard'"
+ ;;
+ werase) shift;
+ e=$(cvt "$1")
+ cmd="$cmd erase $1"
+ bargs="$bargs '\"$e\": backward-kill-word'"
+ ;;
+ lnext) shift;
+ e=$(cvt "$1")
+ cmd="$cmd erase $1"
+ bargs="$bargs '\"$e\": quoted-insert'"
+ ;;
+ *) cmd="$cmd $1"
+ ;;
+ esac
+ shift
+ done
+
+ command stty $cmd
+ if [ -n "$bargs" ]; then
+ builtin bind $bargs
+ fi
+}
diff --git a/examples/functions/func b/examples/functions/func
new file mode 100644
index 00000000..710f6433
--- /dev/null
+++ b/examples/functions/func
@@ -0,0 +1,27 @@
+#
+# func -- print out definitions for functions named by arguments
+#
+# usage: func name [name ...]
+#
+# Chet Ramey
+# chet@ins.CWRU.Edu
+func()
+{
+ local status=0
+
+ if [ $# -eq 0 ] ; then
+ echo "usage: func name [name...]" 1>&2
+ return 1
+ fi
+
+ for f
+ do
+ if [ "$(builtin type -type $f)" != "function" ] ; then
+ echo "func: $f: not a function" 1>&2
+ status=1 # one failed
+ continue
+ fi
+ builtin type $f | sed 1d
+ done
+ return $status
+}
diff --git a/examples/functions/jj.bash b/examples/functions/jj.bash
new file mode 100644
index 00000000..212c9cec
--- /dev/null
+++ b/examples/functions/jj.bash
@@ -0,0 +1,12 @@
+jj ()
+{
+ p=$(jobs $1);
+ echo $p
+
+ case "$p" in
+ [*) echo matches '[*'
+ ;;
+ *) echo not a match\?
+ ;;
+ esac
+}
diff --git a/examples/functions/kshenv b/examples/functions/kshenv
new file mode 100644
index 00000000..fbec76f4
--- /dev/null
+++ b/examples/functions/kshenv
@@ -0,0 +1,183 @@
+#
+# .kshenv -- functions and aliases to provide the beginnings of a ksh
+# environment for bash.
+#
+# Chet Ramey
+# chet@ins.CWRU.Edu
+#
+#
+# These are definitions for the ksh compiled-in `exported aliases'. There
+# are others, but we already have substitutes for them: "history", "type",
+# and "hash".
+#
+alias r="fc -e -"
+alias functions="typeset -f"
+alias integer="typeset -i"
+alias nohup="nohup "
+alias true=":"
+alias false="let 0"
+alias hist="fc"
+
+#
+# An almost-ksh compatible `whence' command. This is as hairy as it is
+# because of the desire to exactly mimic ksh (whose behavior was determined
+# empirically).
+#
+# This depends somewhat on knowing the format of the output of the bash
+# `builtin type' command.
+#
+
+whence()
+{
+ local vflag
+ local path
+
+ vflag=
+ path=
+ if [ "$#" = "0" ] ; then
+ echo "whence: argument expected"
+ return 1
+ fi
+ case "$1" in
+ -v) vflag=1
+ shift 1
+ ;;
+ -*) echo "whence: bad option: $1"
+ return 1
+ ;;
+ *) ;;
+ esac
+
+ if [ "$#" = "0" ] ; then
+ echo "whence: bad argument count"
+ return 1
+ fi
+
+ for cmd
+ do
+ if [ "$vflag" ] ; then
+ echo $(builtin type $cmd | sed 1q)
+ else
+ path=$(builtin type -path $cmd)
+ if [ "$path" ] ; then
+ echo $path
+ else
+ case "$cmd" in
+ /*) echo ""
+ ;;
+ *) case "$(builtin type -type $cmd)" in
+ "") echo ""
+ ;;
+ *) echo "$cmd"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ fi
+ done
+ return 0
+}
+
+#
+# For real ksh homeboy fanatics, redefine the `type' builtin with a ksh
+# version.
+#
+#type()
+#{
+# whence -v "$*"
+#}
+
+cd()
+{
+ case $# in
+ 0) builtin cd "$HOME" ;;
+ 1) builtin cd "$@" ;;
+ 2) old="$1"
+ new="$2"
+ dir=$(echo "$PWD" | sed "s:$old:$new:g")
+ case "$dir" in
+ "$PWD") echo "bash: cd: bad substitution" >&2 ; return 1 ;;
+ *) echo "$dir"
+ builtin cd "$dir"
+ ;;
+ esac
+ ;;
+ *) echo "cd: wrong arg count" >&2 ; return 1 ;;
+ esac
+}
+
+#
+# ksh print emulation
+#
+# print [-Rnprsu[n]] [arg ...]
+#
+# - end of options
+# -R BSD-style -- only accept -n, no escapes
+# -n do not add trailing newline
+# -p no-op (no coprocesses)
+# -r no escapes
+# -s no-op (print to the history file)
+# -u n redirect output to fd n
+#
+
+print()
+{
+ local eflag=-e
+ local nflag=
+ local fd=1
+
+ OPTIND=1
+ while getopts "Rnprsu:" c
+ do
+ case $c in
+ R) eflag=
+ ;;
+ r) eflag=
+ ;;
+ n) nflag=-n
+ ;;
+ u) fd=$OPTARG
+ ;;
+ p|s) ;;
+ esac
+ done
+ shift $[ $OPTIND - 1 ]
+
+ builtin echo $eflag $nflag "$@" >&$fd
+}
+
+# substring function
+# this function should be equivalent to the substring built-in which was
+# eliminated after the 06/29/84 version
+substring ()
+{
+ local lpat flag str #local variables
+ set -f
+ case $1 in
+ -l|-L)
+ flag=$1
+ lpat=$2
+ shift 2
+ ;;
+ esac
+ # test for too few or too many arguments
+ if [ x"$1" = x -o $# -gt 2 ]; then
+ print -u2 'substring: bad argument count'
+ return 1
+ fi
+ str=$1
+ if [ x"$flag" = x-l ]; then #substring -l lpat
+ str=${str#$lpat}
+ elif [ x"$flag" = x-L ]; then
+ str=${str##$lpat} #substring -L lpat
+ fi
+
+ if [ x"$2" != x ]; then
+ echo ${str%$2}
+ else
+ echo $str
+ fi
+
+ return 0
+}
diff --git a/examples/functions/manpage b/examples/functions/manpage
new file mode 100644
index 00000000..3fdc7acf
--- /dev/null
+++ b/examples/functions/manpage
@@ -0,0 +1,129 @@
+# Written from scratch by Tom Tromey (tromey@cns.caltech.edu)
+#
+# manpage -- find and print a manual page.
+# usage: manpage section name [printing]
+#
+function manpage ()
+{
+ local i h cmd zot sec
+ local num="$1"
+ local page="$2"
+ local printing="$3"
+ local mp
+
+ mp="${MANPATH:-/usr/man}"
+ if [ "$#" -lt 2 ]; then return 1; fi # should print usage
+ if [ "$num" != "" ]; then
+ sec="${num%%[a-zA-Z]*}"
+ else
+ sec='[168234571lnpo]'
+ num="$sec"
+ fi
+ for i in $(echo "$mp" | tr : ' '); do
+ if [ ! -d "$i" ]; then continue; fi
+ file="$i"/man"$sec"/"$page"."$num"*
+ set $file
+ file="$1"
+ if [ -f "$file" ]; then
+ zot=$(head -1 "$file")
+ cmd=${MANROFF:-"nroff -man - | col | cat -s"}
+ h=${zot##"'"'\"'}
+ if [ "$h" != "$zot" ]; then
+ while [ "$h" != "" ]; do
+ case "$h" in
+ *e) cmd="${MANEQN:-neqn} | $cmd";;
+ *r) cmd="refer | $cmd";;
+ *t) cmd="tbl | $cmd";;
+ *v) cmd="vgrind | $cmd";;
+ *) ;; # should print error
+ esac
+ h=${h%?}
+ done
+ fi
+ if [ "$printing" != "" ]; then
+ (cd "$i"; eval "$cmd") < "$file" | ${PAGER:-more}
+ else
+ (cd "$i"; eval "$cmd") < "$file" > /tmp/manpage-$$
+ ${PAGER:-more} /tmp/manpage-$$
+ rm -f /tmp/manpage-$$
+ fi
+ break
+ fi
+ done
+}
+
+function whatis_internal ()
+{
+ local j
+ for j in $(echo "$MANPATH" | tr : ' '); do
+ if [ -f "$j/whatis" ]; then
+ eval $2 -i -e "$1" $j/whatis
+ fi
+ done
+}
+
+function whatis ()
+{
+ local name=$(basename "$1")
+ whatis_internal "$name" "grep -w"
+}
+
+function apropos ()
+{
+ whatis_internal "$1" "fgrep"
+}
+
+# Note: "-" and "-t" together not supported. This man could be
+# made a lot better, but it does everything I want.
+function man ()
+{
+ local PAGER printing mpath MANROFF num
+ mpath="${MANPATH:-/usr/man}"
+ while true; do
+ case "$1" in
+ -) PAGER=cat
+ printing= ;;
+ -t)
+ MANROFF=${TROFF:-"ptroff -man -t"}
+ PAGER="${TCAT:-lpr}"
+ printing=yes ;;
+ -M)
+ mpath="$2"
+ shift;;
+ *) break;;
+ esac
+ shift
+ done
+ local MANPATH="$mpath"
+ case "$1" in
+ -f | -k)
+ local g a
+ if [ "$1" = "-f" ]; then
+ g="grep -w"
+ a=$(basename "$2")
+ else
+ g=fgrep
+ a="$2"
+ fi
+ whatis_internal "$a" "$g"
+ ;;
+ [0-9npol] | [0-9][a-z]* | new | public | old | local)
+ if [ "$1" = "new" ]; then
+ num=n
+ elif [ "$1" = "public" ]; then
+ num=p
+ elif [ "$1" = "old" ]; then
+ num=o
+ elif [ "$1" = "local" ]; then
+ num=l
+ else
+ num="$1"
+ fi
+ shift
+ manpage "$num" "$1" "$printing"
+ ;;
+ *)
+ manpage "$num" "$1" "$printing"
+ ;;
+ esac
+}
diff --git a/examples/functions/notify.bash b/examples/functions/notify.bash
new file mode 100644
index 00000000..dafbac5a
--- /dev/null
+++ b/examples/functions/notify.bash
@@ -0,0 +1,58 @@
+trap _notify CHLD
+NOTIFY_ALL=false
+unset NOTIFY_LIST
+unalias false
+
+false()
+{
+ return 1
+}
+
+_notify ()
+{
+ local i j
+ local newlist=
+
+ if $NOTIFY_ALL
+ then
+ return # let bash take care of this itself
+ elif [ -z "$NOTIFY_LIST" ]; then
+ return
+ else
+ set -- $NOTIFY_LIST
+ for i in "$@"
+ do
+ j=$(jobs -n %$i)
+ if [ -n "$j" ]; then
+ echo "$j"
+ jobs -n %$i >/dev/null
+ else
+ newlist="newlist $i"
+ fi
+ done
+ NOTIFY_LIST="$newlist"
+ fi
+}
+
+notify ()
+{
+ local i j
+
+ if [ $# -eq 0 ]; then
+ NOTIFY_ALL=:
+ set -b
+ return
+ else
+ for i in "$@"
+ do
+ # turn a valid job spec into a job number
+ j=$(jobs $i)
+ case "$j" in
+ [*) j=${j%%]*}
+ j=${j#[}
+ NOTIFY_LIST="$NOTIFY_LIST $j"
+ ;;
+ esac
+ done
+ fi
+}
diff --git a/examples/functions/shcat b/examples/functions/shcat
new file mode 100644
index 00000000..55a30965
--- /dev/null
+++ b/examples/functions/shcat
@@ -0,0 +1,7 @@
+shcat()
+{
+ while read line
+ do
+ echo "$line"
+ done
+}
diff --git a/examples/functions/substr b/examples/functions/substr
new file mode 100644
index 00000000..c5576779
--- /dev/null
+++ b/examples/functions/substr
@@ -0,0 +1,79 @@
+#
+# substr -- a function to emulate the ancient ksh builtin
+#
+
+#
+# -l == shortest from left
+# -L == longest from left
+# -r == shortest from right (the default)
+# -R == longest from right
+
+substr()
+{
+ local flag pat str
+ local usage="usage: substr -lLrR pat string or substr string pat"
+
+ case "$1" in
+ -l | -L | -r | -R)
+ flag="$1"
+ pat="$2"
+ shift 2
+ ;;
+ -*)
+ echo "substr: unknown option: $1"
+ echo "$usage"
+ return 1
+ ;;
+ *)
+ flag="-r"
+ pat="$2"
+ ;;
+ esac
+
+ if [ "$#" -eq 0 -o "$#" -gt 2 ] ; then
+ echo "substr: bad argument count"
+ return 2
+ fi
+
+ str="$1"
+
+ #
+ # We don't want -f, but we don't want to turn it back on if
+ # we didn't have it already
+ #
+ case "$-" in
+ "*f*")
+ ;;
+ *)
+ fng=1
+ set -f
+ ;;
+ esac
+
+ case "$flag" in
+ -l)
+ str="${str#$pat}" # substr -l pat string
+ ;;
+ -L)
+ str="${str##$pat}" # substr -L pat string
+ ;;
+ -r)
+ str="${str%$pat}" # substr -r pat string
+ ;;
+ -R)
+ str="${str%%$pat}" # substr -R pat string
+ ;;
+ *)
+ str="${str%$2}" # substr string pat
+ ;;
+ esac
+
+ echo "$str"
+
+ #
+ # If we had file name generation when we started, re-enable it
+ #
+ if [ "$fng" = "1" ] ; then
+ set +f
+ fi
+}
diff --git a/examples/functions/substr2 b/examples/functions/substr2
new file mode 100644
index 00000000..f5e75473
--- /dev/null
+++ b/examples/functions/substr2
@@ -0,0 +1,81 @@
+#
+# substr -- a function to emulate the ancient ksh builtin
+#
+
+# -l == remove shortest from left
+# -L == remove longest from left
+# -r == remove shortest from right (the default)
+# -R == remove longest from right
+
+substr()
+{
+ local flag pat str
+ local usage="usage: substr -lLrR pat string or substr string pat"
+ local options="l:L:r:R:"
+
+ OPTIND=1
+ while getopts "$options" c
+ do
+ case "$c" in
+ l | L | r | R)
+ flag="-$c"
+ pat="$OPTARG"
+ ;;
+ '?')
+ echo "$usage"
+ return 1
+ ;;
+ esac
+ done
+
+ if [ "$OPTIND" -gt 1 ] ; then
+ shift $[ $OPTIND -1 ]
+ fi
+
+ if [ "$#" -eq 0 -o "$#" -gt 2 ] ; then
+ echo "substr: bad argument count"
+ return 2
+ fi
+
+ str="$1"
+
+ #
+ # We don't want -f, but we don't want to turn it back on if
+ # we didn't have it already
+ #
+ case "$-" in
+ "*f*")
+ ;;
+ *)
+ fng=1
+ set -f
+ ;;
+ esac
+
+ case "$flag" in
+ -l)
+ str="${str#$pat}" # substr -l pat string
+ ;;
+ -L)
+ str="${str##$pat}" # substr -L pat string
+ ;;
+ -r)
+ str="${str%$pat}" # substr -r pat string
+ ;;
+ -R)
+ str="${str%%$pat}" # substr -R pat string
+ ;;
+ *)
+ str="${str%$2}" # substr string pat
+ ;;
+ esac
+
+ echo "$str"
+
+ #
+ # If we had file name generation when we started, re-enable it
+ #
+ if [ "$fng" = "1" ] ; then
+ set +f
+ fi
+}
diff --git a/examples/functions/term b/examples/functions/term
new file mode 100644
index 00000000..fbe99f13
--- /dev/null
+++ b/examples/functions/term
@@ -0,0 +1,35 @@
+#
+# term -- a shell function to set the terminal type interactively or not.
+#
+
+term()
+{
+ local t
+
+ if [ $# != 0 ] ; then
+ eval $(tset -sQ $1)
+ else # interactive
+ if [ -z "$TERM" ] ; then
+ TERM="unknown"
+ fi
+
+ case "$TERM" in
+ network|dialup|unknown|lat)
+ TERM=unknown
+ ;;
+ *)
+ eval $(tset -sQ)
+ ;;
+ esac
+
+ while [ "$TERM" = "unknown" ] ; do
+ echo -n "Terminal type: "
+ read t
+ if [ -n "$t" ] ; then
+ eval $(tset -sQ $t)
+ fi
+ done
+ fi
+}
+
+
diff --git a/examples/functions/whatis b/examples/functions/whatis
new file mode 100644
index 00000000..56c5a580
--- /dev/null
+++ b/examples/functions/whatis
@@ -0,0 +1,52 @@
+#
+# whatis -- and implementation of the 10th Edition Unix sh builtin `whatis'
+# command.
+#
+# usage: whatis arg [...]
+#
+# For each argument, whatis prints the associated value as a parameter,
+# builtin, function, alias, or executable file as appropriate. In each
+# case, the value is printed in a form which would yield the same value
+# if typed as input to the shell itself.
+#
+
+whatis()
+{
+ local wusage='usage: whatis arg [arg...]'
+ local fail=0
+
+ if [ $# -eq 0 ] ; then
+ echo "$wusage"
+ return 1
+ fi
+
+ for arg
+ do
+ case $(builtin type -type $arg 2>/dev/null) in
+ "alias")
+ builtin alias "$arg"
+ ;;
+ "function")
+ builtin type "$arg" | sed 1d
+ ;;
+ "builtin")
+ echo builtin "$arg"
+ ;;
+ "file")
+ builtin type -path "$arg"
+ ;;
+ *)
+ # OK, we could have a variable, or we could have nada
+ if [ "$(eval echo \${$arg+set})" = "set" ] ; then
+ # It is a variable, and it is set
+ echo -n "$arg="
+ eval echo '\"'\$$arg'\"'
+ else
+ echo whatis: $arg: not found
+ fail=1
+ fi
+ ;;
+ esac
+ done
+ return $fail
+}
diff --git a/examples/functions/whence b/examples/functions/whence
new file mode 100644
index 00000000..70b2322a
--- /dev/null
+++ b/examples/functions/whence
@@ -0,0 +1,59 @@
+#
+# An almost-ksh compatible `whence' command. This is as hairy as it is
+# because of the desire to exactly mimic ksh.
+#
+# This depends somewhat on knowing the format of the output of the bash
+# `builtin type' command.
+#
+# Chet Ramey
+# chet@ins.CWRU.Edu
+#
+whence()
+{
+ local vflag= path=
+
+ if [ "$#" = "0" ] ; then
+ echo "whence: argument expected"
+ return 1
+ fi
+ case "$1" in
+ -v) vflag=1
+ shift 1
+ ;;
+ -*) echo "whence: bad option: $1"
+ return 1
+ ;;
+ *) ;;
+ esac
+
+ if [ "$#" = "0" ] ; then
+ echo "whence: bad argument count"
+ return 1
+ fi
+
+ for cmd
+ do
+ if [ "$vflag" ] ; then
+ echo $(builtin type $cmd | sed 1q)
+ else
+ path=$(builtin type -path $cmd)
+ if [ "$path" ] ; then
+ echo $path
+ else
+ case "$cmd" in
+ /*) if [ -x "$cmd" ]; then
+ echo "$cmd"
+ fi
+ ;;
+ *) case "$(builtin type -type $cmd)" in
+ "") ;;
+ *) echo "$cmd"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ fi
+ done
+ return 0
+}
diff --git a/examples/scripts/adventure.sh b/examples/scripts/adventure.sh
new file mode 100755
index 00000000..a6d2eaa3
--- /dev/null
+++ b/examples/scripts/adventure.sh
@@ -0,0 +1,545 @@
+#!/bin/bash
+# ash -- "Adventure shell"
+# last edit: 86/04/21 D A Gwyn
+# SCCS ID: @(#)ash.sh 1.4
+
+OPATH=$PATH
+
+ask()
+{
+ echo -n "$@" '[y/n] '
+ read ans
+
+ case "$ans" in
+ y*|Y*)
+ return 0
+ ;;
+ *)
+ return 1
+ ;;
+ esac
+}
+
+CAT=${PAGER:-more}
+
+ash_inst()
+{
+ cat <<- EOF
+
+ Instructions for the Adventure shell
+
+ Welcome to the Adventure shell! In this exploration of the UNIX file
+ system, I will act as your eyes and hands. As you move around, I will
+ describe whatever is visible and will carry out your commands. The
+ general form of a command is
+ Verb Object Extra_stuff.
+ Most commands pay no attention to the "Extra_stuff", and many do not
+ need an "Object". A typical command is
+ get all
+ which picks up all files in the current "room" (directory). You can
+ find out what you are carrying by typing the command
+ inventory
+ The command "help" results in a full description of all commands that I
+ understand. To quit the Adventure shell, type
+ quit
+
+ There are UNIX monsters lurking in the background. These are also
+ known as "commands with arguments".
+
+ Good luck!
+ EOF
+}
+
+ash_help()
+{
+echo "I understand the following commands (synonyms in parentheses):"
+echo ""
+
+echo "change OBJECT to NEW_NAME changes the name of the object"
+echo "clone OBJECT as NEW_NAME duplicates the object"
+echo "drop OBJECTS leaves the objects in the room"
+echo "enter (go) PASSAGE takes the labeled passage"
+echo "examine OBJECTS describes the objects in detail"
+echo "feed OBJECT to MONSTER stuffs the object into a UNIX monster"
+echo "get (take) OBJECTS picks up the specified objects"
+echo "gripe (bug) report a problem with the Adventure shell"
+echo "help prints this summary"
+echo "inventory (i) tells what you are carrying"
+echo "kill (destroy) OBJECTS destroys the objects"
+echo "look (l) describes the room, including hidden objects"
+echo "open (read) OBJECT shows the contents of an object"
+echo "quit (exit) leaves the Adventure shell"
+echo "resurrect OBJECTS attempts to restore dead objects"
+echo "steal OBJECT from MONSTER obtains the object from a UNIX monster"
+echo "throw OBJECT at daemon feeds the object to the printer daemon"
+echo "up takes the overhead passage"
+echo "wake MONSTER awakens a UNIX monster"
+echo "where (w) tells you where you are"
+echo "xyzzy moves you to your home"
+}
+
+MAINT=chet@ins.cwru.edu
+
+PATH=/usr/ucb:/bin:/usr/bin:/usr/local/bin:.
+export PATH
+
+trap 'echo Ouch!' 2 3
+#trap '' 18 # disable Berkeley job control
+
+ash_lk(){ echo " $1 " | fgrep " $2 " >&- 2>&-; }
+ash_pr(){ echo $* | tr ' ' '\012' | pr -5 -t -w75 -l$[ ( $# + 4 ) / 5 ]; }
+ash_rm(){ echo " $1 " | sed -e "s/ $2 / /" -e 's/^ //' -e 's/ $//'; }
+
+cd
+LIM=.limbo # $HOME/$LIM contains "destroyed" objects
+mkdir $LIM >&- 2>&-
+KNAP=.knapsack # $HOME/$KNAP contains objects being "carried"
+if [ ! -d $KNAP ]
+then mkdir $KNAP >&- 2>&-
+ if [ $? = 0 ]
+ then echo 'You found a discarded empty knapsack.'
+ else echo 'You have no knapsack to carry things in.'
+ exit 1
+ fi
+else echo 'One moment while I peek in your old knapsack...'
+fi
+
+kn=`echo \`ls -a $KNAP | sed -e '/^\.$/d' -e '/^\.\.$/d'\``
+
+if ask 'Welcome to the Adventure shell! Do you need instructions?'
+then
+ ash_inst
+ echo -n 'Type a newline to continue: '
+ read
+fi
+
+wiz=false
+cha=false
+prev=$LIM
+while :
+do room=`pwd`
+ if [ $room != $prev ]
+ then if [ $room = $HOME ]
+ then echo 'You are in your own home.'
+ else echo "You have entered $room."
+ fi
+ exs=
+ obs=
+ hexs=
+ hobs=
+ f=false
+ for i in `ls -a`
+ do case $i in
+ .|..) ;;
+ .*) if [ -f $i ]
+ then hobs="$hobs $i"
+ elif [ -d $i ]
+ then hexs="$hexs $i"
+ else f=true
+ fi
+ ;;
+ *) if [ -f $i ]
+ then obs="$obs $i"
+ elif [ -d $i ]
+ then exs="$exs $i"
+ else f=true
+ fi
+ ;;
+ esac
+ done
+ if [ "$obs" ]
+ then echo 'This room contains:'
+ ash_pr $obs
+ else echo 'The room looks empty.'
+ fi
+ if [ "$exs" ]
+ then echo 'There are exits labeled:'
+ ash_pr $exs
+ echo 'as well as a passage overhead.'
+ else echo 'There is a passage overhead.'
+ fi
+ if sh -c $f
+ then echo 'There are shadowy figures in the corner.'
+ fi
+ prev=$room
+ fi
+
+ echo -n '-advsh> ' # prompt
+ read verb obj x
+ if [ $? != 0 ]
+ then verb=quit # EOF
+ fi
+
+ case $verb in
+ change) if [ "$obj" ]
+ then if ash_lk "$obs $hobs" "$obj"
+ then set -- $x
+ case "$1" in
+ to) if [ "$2" ]
+ then if [ -f $2 ]
+ then echo "You must destroy $2 first."
+ set --
+ fi
+ if [ "$2" ]
+ then if mv $obj $2 >&- 2>&-
+ then echo "The $obj shimmers and turns into $2."
+ obs=`ash_rm "$2 $obs" "$obj"`
+ else echo "There is a cloud of smoke but the $obj is unchanged."
+ fi
+ fi
+ else echo 'To what?'
+ fi
+ ;;
+ *) echo "Change $obj to what?"
+ ;;
+ esac
+ else if ash_lk "$kn" "$obj"
+ then echo 'You must drop it first.'
+ else echo "I see no $obj here."
+ fi
+ fi
+ else echo 'Change what?'
+ fi
+ ;;
+ clone) if [ "$obj" ]
+ then if ash_lk "$obs $hobs" "$obj"
+ then if [ ! -r $obj ]
+ then echo "The $obj does not wish to be cloned."
+ else set -- $x
+ case "$1" in
+ as) if [ "$2" ]
+ then if [ -f $2 ]
+ then echo "You must destroy $2 first."
+ else if cp $obj $2 >&- 2>&-
+ then echo "Poof! When the smoke clears, you see the new $2."
+ obs="$obs $2"
+ else echo 'You hear a dull thud but no clone appears.'
+ fi
+ fi
+ else echo 'As what?'
+ fi
+ ;;
+ *) echo "Clone $obj as what?"
+ ;;
+ esac
+ fi
+ else if ash_lk "$kn" "$obj"
+ then echo 'You must drop it first.'
+ else echo "I see no $obj here."
+ fi
+ fi
+ else echo 'Clone what?'
+ fi
+ ;;
+ drop) if [ "$obj" ]
+ then for it in $obj $x
+ do if ash_lk "$kn" "$it"
+ then if [ -w $it ]
+ then echo "You must destroy $it first."
+ else if mv $HOME/$KNAP/$it $it >&- 2>&-
+ then echo "$it: dropped."
+ kn=`ash_rm "$kn" "$it"`
+ obs=`echo $it $obs`
+ else echo "The $it is caught in your knapsack."
+ fi
+ fi
+ else echo "You're not carrying the $it!"
+ fi
+ done
+ else echo 'Drop what?'
+ fi
+ ;;
+ enter|go) if [ "$obj" ]
+ then if [ $obj != up ]
+ then if ash_lk "$exs $hexs" "$obj"
+ then if [ -x $obj ]
+ then if cd $obj
+ then echo 'You squeeze through the passage.'
+ else echo "You can't go that direction."
+ fi
+ else echo 'An invisible force blocks your way.'
+ fi
+ else echo 'I see no such passage.'
+ fi
+ else if cd ..
+ then echo 'You struggle upwards.'
+ else echo "You can't reach that high."
+ fi
+ fi
+ else echo 'Which passage?'
+ fi
+ ;;
+ examine) if [ "$obj" ]
+ then if [ $obj = all ]
+ then $obj=`echo $obs $exs`
+ x=
+ fi
+ for it in $obj $x
+ do if ash_lk "$obs $hobs $exs $hexs" "$it"
+ then echo "Upon close inspection of the $it, you see:"
+ ls -ld $it 2>&-
+ if [ $? != 0 ]
+ then echo "-- when you look directly at the $it, it vanishes."
+ fi
+ else if ash_lk "$kn" "$it"
+ then echo 'You must drop it first.'
+ else echo "I see no $it here."
+ fi
+ fi
+ done
+ else echo 'Examine what?'
+ fi
+ ;;
+ feed) if [ "$obj" ]
+ then if ash_lk "$obs $hobs" "$obj"
+ then set -- $x
+ case "$1" in
+ to) if [ "$2" ]
+ then shift
+ if PATH=$OPATH $* <$obj 2>&-
+ then echo "The $1 monster devours your $obj."
+ if rm -f $obj >&- 2>&-
+ then obs=`ash_rm "$obs" "$obj"`
+ else echo 'But he spits it back up.'
+ fi
+ else echo "The $1 monster holds his nose in disdain."
+ fi
+ else echo 'To what?'
+ fi
+ ;;
+ *) echo "Feed $obj to what?"
+ ;;
+ esac
+ else if ash_lk "$kn" "$obj"
+ then echo 'You must drop it first.'
+ else echo "I see no $obj here."
+ fi
+ fi
+ else echo 'Feed what?'
+ fi
+ ;;
+ get|take) if [ "$obj" ]
+ then if [ $obj = all ]
+ then obj="$obs"
+ x=
+ fi
+ for it in $obj $x
+ do if ash_lk "$obs $hobs" "$it"
+ then if ash_lk "$kn" "$it"
+ then echo 'You already have one.'
+ else if mv $it $HOME/$KNAP/$it >&- 2>&-
+ then echo "$it: taken."
+ kn="$it $kn"
+ obs=`ash_rm "$obs" "$it"`
+ else echo "The $it is too heavy."
+ fi
+ fi
+ else echo "I see no $it here."
+ fi
+ done
+ else echo 'Get what?'
+ fi
+ ;;
+ gripe|bug) echo 'Please describe the problem and your situation at the time it failed.\nEnd the bug report with a line containing just a Ctrl-D.'
+ cat | mail $MAINT -s 'ash bug'
+ echo 'Thank you!'
+ ;;
+ help) ash_help
+ ;;
+ inventory|i) if [ "$kn" ]
+ then echo 'Your knapsack contains:'
+ ash_pr $kn
+ else echo 'You are poverty-stricken.'
+ fi
+ ;;
+ kill|destroy) if [ "$obj" ]
+ then if [ $obj = all ]
+ then x=
+ if ask "Do you really want to attempt to $verb them all?"
+ then obj=`echo $obs`
+ else echo 'Chicken!'
+ obj=
+ fi
+ fi
+ for it in $obj $x
+ do if ash_lk "$obs $hobs" "$it"
+ then if mv $it $HOME/$LIM <&- >&- 2>&-
+ then if [ $verb = kill ]
+ then echo "The $it cannot defend himself; he dies."
+ else echo "You have destroyed the $it; it vanishes."
+ fi
+ obs=`ash_rm "$obs" "$it"`
+ else if [ $verb = kill ]
+ then echo "Your feeble blows are no match for the $it."
+ else echo "The $it is indestructible."
+ fi
+ fi
+ else if ash_lk "$kn" "$it"
+ then echo "You must drop the $it first."
+ found=false
+ else echo "I see no $it here."
+ fi
+ fi
+ done
+ else echo 'Kill what?'
+ fi
+ ;;
+ look|l) obs=`echo $obs $hobs`
+ hobs=
+ if [ "$obs" ]
+ then echo 'The room contains:'
+ ash_pr $obs
+ else echo 'The room is empty.'
+ fi
+ exs=`echo $exs $hexs`
+ hexs=
+ if [ "$exs" ]
+ then echo 'There are exits plainly labeled:'
+ ash_pr $exs
+ echo 'and a passage directly overhead.'
+ else echo 'The only exit is directly overhead.'
+ fi
+ ;;
+ magic) if [ "$obj" = mode ]
+ then if sh -c $cha
+ then echo 'You had your chance and you blew it.'
+ else if ask 'Are you a wizard?'
+ then echo -n 'Prove it! Say the magic word: '
+ read obj
+ if [ "$obj" = armadillo ]
+ then echo 'Yes, master!!'
+ wiz=true
+ else echo "Homie says: I don't think so"
+ cha=true
+ fi
+ else echo "I didn't think so."
+ fi
+ fi
+ else echo 'Nice try.'
+ fi
+ ;;
+ open|read) if [ "$obj" ]
+ then if ash_lk "$obs $hobs" "$obj"
+ then if [ -r $obj ]
+ then if [ -s $obj ]
+ then echo "Opening the $obj reveals:"
+ $CAT < $obj
+ if [ $? != 0 ]
+ then echo '-- oops, you lost the contents!'
+ fi
+ else echo "There is nothing inside the $obj."
+ fi
+ else echo "You do not have the proper tools to open the $obj."
+ fi
+ else if ash_lk "$kn" "$obj"
+ then echo 'You must drop it first.'
+ found=false
+ else echo "I see no $obj here."
+ fi
+ fi
+ else echo 'Open what?'
+ fi
+ ;;
+ quit|exit) if ask 'Do you really want to quit now?'
+ then if [ "$kn" ]
+ then echo 'The contents of your knapsack will still be there next time.'
+ fi
+ rm -rf $HOME/$LIM
+ echo 'See you later!'
+ exit 0
+ fi
+ ;;
+ resurrect) if [ "$obj" ]
+ then for it in $obj $x
+ do if ash_lk "$obs $hobs" "$it"
+ then echo "The $it is already alive and well."
+ else if mv $HOME/$LIM/$it $it <&- >&- 2>&-
+ then echo "The $it staggers to his feet."
+ obs=`echo $it $obs`
+ else echo "There are sparks but no $it appears."
+ fi
+ fi
+ done
+ else echo 'Resurrect what?'
+ fi
+ ;;
+ steal) if [ "$obj" ]
+ then if ash_lk "$obs $hobs" "$obj"
+ then echo 'There is already one here.'
+ else set -- $x
+ case "$1" in
+ from) if [ "$2" ]
+ then shift
+ if PATH=$OPATH $* >$obj 2>&-
+ then echo "The $1 monster drops the $obj."
+ obs=`echo $obj $obs`
+ else echo "The $1 monster runs away as you approach."
+ rm -f $obj >&- 2>&-
+ fi
+ else echo 'From what?'
+ fi
+ ;;
+ *) echo "Steal $obj from what?"
+ ;;
+ esac
+ fi
+ else echo 'Steal what?'
+ fi
+ ;;
+ throw) if [ "$obj" ]
+ then if ash_lk "$obs $hobs" "$obj"
+ then set -- $x
+ case "$1" in
+ at) case "$2" in
+ daemon) if sh -c "lpr -r $obj"
+ then echo "The daemon catches the $obj, turns it into paper,\nand leaves it in the basket."
+ obs=`ash_rm "$obs" "$obj"`
+ else echo "The daemon is nowhere to be found."
+ fi
+ ;;
+ *) echo 'At what?'
+ ;;
+ esac
+ ;;
+ *) echo "Throw $obj at what?"
+ ;;
+ esac
+ else if ash_lk "$kn" "$obj"
+ then echo 'It is in your knapsack.'
+ found=false
+ else echo "I see no $obj here."
+ fi
+ fi
+ else echo 'Throw what?'
+ fi
+ ;;
+ u|up) if cd ..
+ then echo 'You pull yourself up a level.'
+ else echo "You can't reach that high."
+ fi
+ ;;
+ wake) if [ "$obj" ]
+ then echo "You awaken the $obj monster:"
+ PATH=$OPATH $obj $x
+ echo 'The monster slithers back into the darkness.'
+ else echo 'Wake what?'
+ fi
+ ;;
+ w|where) echo "You are in $room."
+ ;;
+ xyzzy) if cd
+ then echo 'A strange feeling comes over you.'
+ else echo 'Your spell fizzles out.'
+ fi
+ ;;
+ *) if [ "$verb" ]
+ then if sh -c $wiz
+ then PATH=$OPATH $verb $obj $x
+ else echo "I don't know how to \"$verb\"."
+ echo 'Type "help" for assistance.'
+ fi
+ else echo 'Say something!'
+ fi
+ ;;
+ esac
+done
diff --git a/examples/scripts/bcsh.sh b/examples/scripts/bcsh.sh
new file mode 100644
index 00000000..9d93b305
--- /dev/null
+++ b/examples/scripts/bcsh.sh
@@ -0,0 +1,1254 @@
+# 1-Feb-86 09:37:35-MST,30567;000000000001
+# Return-Path: <unix-sources-request@BRL.ARPA>
+# Received: from BRL-TGR.ARPA by SIMTEL20.ARPA with TCP; Sat 1 Feb 86 09:36:16-MST
+# Received: from usenet by TGR.BRL.ARPA id a002623; 1 Feb 86 9:33 EST
+# From: chris <chris@globetek.uucp>
+# Newsgroups: net.sources
+# Subject: Improved Bcsh (Bourne Shell Cshell-Emulator)
+# Message-ID: <219@globetek.UUCP>
+# Date: 30 Jan 86 17:34:26 GMT
+# To: unix-sources@BRL-TGR.ARPA
+#
+# This is a new, improved version of my Bourne shell cshell-emulator.
+# The code has been cleaned up quite a bit, and a couple of new features
+# added (now supports 'noclobber' and 'iclobber' variables). A bug with
+# 'eval' that caused "illegal I/O" error messages on vanilla V7 shells has
+# also been fixed.
+
+# I have posted the program in its entirety because a context diff of the
+# old and new versions was longer than the new version...
+
+# --Chris
+# Bcsh -- A Simple Cshell-Like Command Pre-Processor For The Bourne Shell
+#
+# "Copyright (c) Chris Robertson, December 1985"
+#
+# This software may be used for any purpose provided the original
+# copyright notice and this notice are affixed thereto. No warranties of
+# any kind whatsoever are provided with this software, and it is hereby
+# understood that the author is not liable for any damagages arising
+# from the use of this software.
+#
+# Features Which the Cshell Does Not Have:
+# ----------------------------------------
+#
+# + command history persists across bcsh sessions
+# + global last-command editing via 'g^string1^string2^' syntax
+# + edit any command via $EDITOR or $VISUAL editors
+# + history file name, .bcshrc file name, alias file name, and number
+# of commands saved on termination can be set by environment variables
+# + prompt may evaluate commands, such as `pwd`, `date`, etc.
+# + the whole text of interactive 'for' and 'while' loops and 'if'
+# statements goes into the history list and may be re-run or edited
+# + multiple copies of commands and requests to see command history
+# are not added to the history list
+# + the history mechanism actually stores all commands entered in a
+# current session, not just $history of them. This means that you
+# can increase $history on the fly and at once have a larger history.
+#
+#
+# Synonyms:
+# ---------
+#
+# logout, exit, bye write out history file and exit
+# h, history show current history list
+#
+#
+# Aliases:
+# --------
+#
+# alias NAME CMND create an alias called NAME to run CMND
+# unalias NAME remove the alias NAME
+#
+# There are no 'current-session only' aliases -- all alias and unalias
+# commands are permanent, and stored in the $aliasfile.
+#
+# If an alias contains positional variables -- $1, $2, $*, etc. -- any
+# arguments following the alias name are considered to be values for
+# those variables, and the alias is turned into a command of the form
+# 'set - arguments;alias'. Otherwise, a simple substitution is performed
+# for the alias and the rest of the command preserved. The cshell
+# convention of using '\!:n' in an alias to get bits of the current
+# command is mercifully abandoned.
+#
+# Quotes are not necessary around the commands comprising an alias;
+# in fact, any enclosing quotes are stripped when the alias is added
+# to the file.
+#
+# A couple of typical aliases might be:
+#
+# goto cd $1;pwd
+# l ls -F
+#
+# Note that aliasing something to "commands;logout" will not work -- if
+# you want something to happen routinely on logout put it in the file
+# specified by $logoutfile, default = $HOME/.blogout.
+#
+#
+# Command Substitutions:
+# ----------------------
+#
+# !! substitute last command from history list
+# !!:N substitute Nth element of last command from
+# history list -- 0 = command name, 1 = 1st arg
+# !!:$ substitute last element of last command from
+# history list
+# !!:* substitute all arguments to last command
+# from history list
+# !NUMBER substitute command NUMBER from the history list
+# !NUMBER:N as above, but substitute Nth element, where
+# 0 = command name, 1 = 1st arg, etc.
+# !NUMBER:$ as above, but substitute last element
+# !NUMBER:* as above, but substitute all arguments
+# !-NUMBER substitute the command NUMBER lines from the
+# end of the history list; 1 = last command
+# !-NUMBER:N as above, but substitute Nth element, where
+# 0 = command name, 1 = 1st arg, etc.
+# !-NUMBER:$ as above, but substitute last element
+# !-NUMBER:* as above, but substitute all arguments
+# !?STRING substitute most-recent command from history list
+# containing STRING -- STRING must be enclosed in
+# braces if followed by any other characters
+# !?STRING:N as above, but substitute Nth element, where
+# 0 = command name, 1 = 1st arg, etc.
+# !?STRING:$ as above, but substitute last element
+# !?STRING:* as above, but substitute all arguments
+#
+#
+# Command Editing:
+# ----------------
+#
+# CMND~e edit CMND using $EDITOR, where CMND may be found
+# using a history substitution
+# CMND~v edit CMND using $VISUAL, where CMND may be found
+# using a history substitution
+# " ^string1^string2^ substitute string2 for string1 in last command"
+# command and run it
+# " g^string1^string2^ globally substitute string2 for string1 in "
+# last command and run it
+# !NUMBER:s/string1/string2/
+# substitute string2 for string1 in
+# command NUMBER and run it
+# !NUMBER:gs/string1/string2/
+# globally substitute string2 for string1 in
+# command NUMBER and run it
+# !?STRING:s/string1/string2/
+# substitute string2 for string1 in last command
+# containing STRING and run it
+# !?STRING:gs/string1/string2/
+# globally substitute string2 for string1 in last
+# command containing STRING and run it
+#
+# Any command which ends in the string ":p" is treated as a normal
+# command until all substitutions have been completed. The trailing
+# ":p" is then stripped, and the command is simply echoed and added to
+# the history list instead of being executed.
+#
+# None of the other colon extensions of the cshell are supported.
+#
+#
+# Shell Environment Variables:
+# ----------------------------
+#
+# EDITOR editor used by ~e command, default = "ed"
+# VISUAL editor used by ~v command, default = "vi"
+# MAIL your system mailbox
+# PAGER paging program used by history command, default = "more"
+# PS1 primary prompt
+# PS2 secondary prompt
+# history number of commands in history list, default = 22
+# histfile file history list is saved in, default = $HOME/.bhistory
+# savehist number of commands remembered from last bcsh session
+# aliasfile file of aliased commands, default = $HOME/.baliases
+# logoutfile file of commands to be executed before termination
+# inc_cmdno yes/no -- keep track of command numbers or not
+# noclobber if set, existing files are not overwritten by '>'
+# iclobber if both noclobber and iclobber are set, the user is
+# prompted for confirmation before existing files are
+# overwritten by '>'
+#
+# Note: if you are setting either noclobber or iclobber mid-session,
+# set them to 'yes'
+#
+#
+# Regular Shell Variables:
+# ------------------------
+#
+# Shell variables may be set via Bourne or cshell syntax, e.g., both
+# "set foo=bar" and "foo=bar" set a variable called "foo" with the value
+# "bar". However, all variables are automatically set as environment
+# variables, so there is no need to export them. Conversely, there
+# are NO local variables. Sorry, folks.
+#
+# A cshell-style "setenv" command is turned into a regular "set" command.
+#
+#
+# The Prompt:
+# ----------
+#
+# You may, if you wish, have a command executed in your prompt. If
+# the variable PS1 contains a dollar sign or a backquote, it is
+# evaluated and the result used as the prompt, provided the evaluation
+# did not produce a "not found" error message. The two special cases
+# of PS1 consisting solely of "$" or "$ " are handled correctly. For
+# example, to have the prompt contain the current directory followed
+# by a space, enter:
+#
+# PS1=\'echo "`pwd` "\'
+#
+# You need the backslashed single quotes to prevent the command being
+# evaluated by the variable-setting mechanism and the shell before it
+# is assigned to PS1.
+#
+# To include the command number in your prompt, enter the command:
+#
+# PS1=\'echo "$cmdno "\'
+#
+#
+# Shell Control-Flow Syntax:
+# --------------------------
+#
+# 'While', 'for', 'case', and 'if' commands entered in Bourne shell
+# syntax are executed as normal.
+#
+# A valiant attempt is made to convert 'foreach' loops into 'for' loops,
+# cshell-syntax 'while' loops into Bourne shell syntax, and 'switch'
+# statements into 'case' statements. I cannot guarantee to always get it
+# right. If you forget the 'do' in a 'while' or 'for' loop, or finish
+# them with 'end' instead of 'done', this will be corrected.
+#
+# Note that cshell-to-Bourne control flow conversions do not take place
+# if control is nested -- e.g., a 'foreach' inside a 'while' will fail.
+#
+# The simple-case cshell "if (condition) command" is turned into Bourne
+# syntax. Other 'if' statements are left alone apart from making the
+# 'then' a separate statement, because constructing a valid interactive
+# cshell 'if' statement is essentially an exercise in frustration anyway.
+# The cshell and Bourne shell have sufficiently different ideas about
+# conditions that if is probably best to resign yourself to learning
+# the Bourne shell conventions.
+#
+# Note that since most of the testing built-ins of the cshell are
+# not available in the Bourne shell, a complex condition in a 'while'
+# loop or an 'if' statement will probably fail.
+#
+#
+# Bugs, Caveats, etc.:
+# --------------------
+#
+# This is not a super-speedy program. Be patient, especially on startup.
+#
+# To the best of my knowledge this program should work on ANY Bourne
+# shell -- note that if your shell does not understand 'echo -n' you
+# will have to re-set the values of '$n' and '$c'.
+#
+# This program may run out of stack space on a 16-bit machine where
+# /bin/sh is not split-space.
+#
+# Mail checking is done every 10 commands if $MAIL is set in your
+# environment. For anything fancier, you will have to hack the code.
+#
+# Because commands are stuffed in a file before sh is invoked on them,
+# error messages from failed commands are ugly.
+#
+# Failed history substitutions either give nothing at all, or a
+# "not found" style of error message.
+#
+# A command history is kept whether you want it or not. This may be
+# perceived as a bug or a feature, depending on which side of bed you
+# got out on.
+#
+# If you want a real backslash in a command, you will have to type two
+# of them because the shell swallows the first backslash in the initial
+# command pickup. This means that to include a non-history '!' in a
+# command you need '\\!' -- a real wart, especially for net mail,
+# but unavoidable.
+#
+# Commands containing an '@' will break all sorts of things.
+#
+# Very complex history substitutions may fail.
+#
+# File names containing numbers may break numeric history sustitutions.
+#
+# Commands containing bizzare sequences of characters may conflict
+# with internal kludges.
+#
+# Aliasing something to "commands;logout" will not work -- if you
+# want something to happen routinely on logout, put it in the file
+# specified by $logoutfile, default = $HOME/.blogout.
+#
+# Please send all bug reports to ihnp4!utzoo!globetek!chris.
+# Flames will be posted to net.general with 'Reply-to' set to your
+# ' path... :-) '
+#
+#
+#
+# ************* VERY IMPORTANT NOTICE *************
+#
+# If your shell supports # comments, then REPLACE all the colon 'comments'
+# with # comments. If it does not, then REMOVE all the 'comment' lines from the
+# working copy of the file, as it will run MUCH faster -- the shell evaluates
+# lines starting with a colon but does not actually execute them, so you will
+# save the read-and-evaluate time by removing them.
+
+case "`echo -n foo`" in
+ -n*)
+ n=
+ c="\c"
+ ;;
+ foo)
+ n=-n
+ c=
+ ;;
+ *)
+ echo "Your 'echo' command is broken."
+ exit 1
+ ;;
+esac
+history=${history-22}
+savehist=${savehist-22}
+histfile=${histfile-$HOME/.bhistory}
+logoutfile=${logoutfile-$HOME/.blogout}
+EDITOR=${EDITOR-ed}
+VISUAL=${VISUAL-vi}
+PAGER=${PAGER-more}
+
+aliasfile=${aliasfile-$HOME/.baliases}
+
+# the alias file may contain 1 blank line, so a test -s will not work
+
+case "`cat $aliasfile 2> /dev/null`" in
+ "")
+ doalias=no
+ ;;
+ *)
+ doalias=yes
+ ;;
+esac
+
+if test -s "${sourcefile-$HOME/.bcshrc}"
+ then
+ . ${sourcefile-$HOME/.bcshrc}
+fi
+
+if test -s "$histfile"
+ then
+ cmdno="`set - \`wc -l $histfile\`;echo $1`"
+ cmdno="`expr \"$cmdno\" + 1`"
+ lastcmd="`tail -1 $histfile`"
+ copy=false
+ ohist=$histfile
+ while test ! -w "$histfile"
+ do
+ echo "Cannot write to history file '$histfile'."
+ echo $n "Please enter a new history filename: $c"
+ read histfile
+ copy=true
+ done
+ if $copy
+ then
+ cp $ohist $histfile
+ fi
+else
+ cat /dev/null > $histfile
+ cmdno=1
+ lastcmd=
+fi
+
+# keep track of command number as the default
+
+inc_cmdno=${inc_cmdo-yes}
+
+# default prompts -- PS1 and PS2 may be SET but EMPTY, so '${PS1-% }' syntax
+# is not used here
+
+case "$PS1" in
+ "")
+ PS1="% "
+ ;;
+esac
+case "$PS2" in
+ "")
+ PS2="> "
+ ;;
+esac
+
+export histfile savehist history aliasfile EDITOR VISUAL PAGER cmdno PS1 PS2
+
+case "$MAIL" in
+ "")
+ ;;
+ *)
+ if [ -f $MAIL ]; then
+ mailsize=`set - \`wc -c $MAIL\`;echo $1`
+ else
+ mailsize=0
+ fi
+ ;;
+esac
+
+trap ':' 2
+trap exit 3
+trap "tail -$savehist $histfile>/tmp/hist$$;uniq /tmp/hist$$ > $histfile;\
+rm -f /tmp/*$$;exit 0" 15
+
+getcmd=yes
+mailcheck=
+exclaim=
+echoit=
+mailprompt=
+
+while :
+do
+
+ run=yes
+ case "$mailprompt" in
+ "")
+ ;;
+ *)
+ echo "$mailprompt"
+ ;;
+ esac
+ case "$getcmd" in
+ yes)
+ : guess if the prompt should be evaluated or not
+ case "$PS1" in
+ \$|\$\ )
+ echo $n "$PS1$c"
+ ;;
+ *\`*|*\$*)
+ tmp="`(eval $PS1) 2>&1`"
+ case "$tmp" in
+ *not\ found)
+ echo $n "$PS1$c"
+ ;;
+ *)
+ echo $n "$tmp$c"
+ ;;
+ esac
+ ;;
+ *)
+ echo $n "$PS1$c"
+ ;;
+ esac
+
+ read cmd || cmd="exit"
+ ;;
+ *) ;;
+ esac
+
+ case "$MAIL" in
+ "")
+ ;;
+ *)
+ : check for mail every 10 commands
+ case "$mailcheck" in
+ 1111111111)
+ mailcheck=
+ if [ -f $MAIL ]; then
+ newsize="`set - \`wc -c $MAIL\`;echo $1`"
+ else
+ newsize=0
+ fi
+ if test "$newsize" -gt "$mailsize"; then
+ mailprompt="You have new mail"
+ else
+ mailprompt=
+ fi
+ mailsize=$newsize
+ ;;
+ *)
+ mailcheck=1$mailcheck
+ ;;
+ esac
+ ;;
+ esac
+ hist=no
+
+ case "$cmd" in
+ "")
+ continue
+ ;;
+ sh)
+ sh
+ run=no
+ ;;
+ !!)
+ cmd=$lastcmd
+ echoit=yes
+ getcmd=no
+ continue
+ ;;
+ *:p)
+ cmd="`expr \"$cmd\" : '\(.*\):p'` +~+p"
+ getcmd=no
+ continue
+ ;;
+ foreach[\ \ ]*)
+ while test "$line" != "end"; do
+ echo $n "$PS2$c"
+ read line
+ cmd="${cmd};$line"
+ done
+ echo "$cmd" > /tmp/bcsh$$
+ ed - /tmp/bcsh$$ << ++++
+ s/end/done/
+ s/foreach[ ]\(.*\)(/for \1 in /
+ s/)//
+ s/;/;do /
+ w
+++++
+ ;;
+ for[\ \ ]*|while[\ \ ]*)
+ # try to catch the most common cshell-to-Bourne-shell
+ # mistakes
+
+ echo $n "$PS2$c"
+ read line
+ case "$line" in
+ *do)
+ line="do :"
+ ;;
+ *do*)
+ ;;
+ *)
+ line="do $line"
+ ;;
+ esac
+
+ cmd="${cmd};$line"
+ while test "$line" != "done" -a "$line" != "end"
+ do
+ echo $n "$PS2$c"
+ read line
+ case "$line" in
+ end)
+ line=done
+ ;;
+ esac
+ cmd="${cmd};$line"
+ done
+ echo "$cmd" > /tmp/bcsh$$
+ ;;
+ if[\ \ ]*)
+ while test "$line" != "fi" -a "$line" != "endif"
+ do
+ echo $n "$PS2$c"
+ read line
+ case "$line" in
+ *[a-z]*then)
+ line="`expr \"$line\" : '\(.*\)then'`;then"
+ ;;
+ endif)
+ line=fi
+ ;;
+ esac
+ cmd="${cmd};$line"
+ done
+ echo "$cmd" > /tmp/bcsh$$
+ case "`grep then /tmp/bcsh$$`" in
+ "")
+ # fix 'if foo bar' cases
+
+ ed - /tmp/bcsh$$ << ++++
+ s/)/);then/
+ s/.*/;fi/
+ w
+++++
+ ;;
+ esac
+ ;;
+ case[\ \ ]*)
+ while test "$line" != "esac"
+ do
+ echo $n "$PS2$c"
+ read line
+ cmd="${cmd}@$line"
+ done
+ cmd="`echo \"$cmd\" | tr '@' ' '`"
+ echo "$cmd" > /tmp/bcsh$$
+ ;;
+ switch[\ \ ]*)
+ while test "$line" != "endsw"
+ do
+ echo $n "$PS2$c"
+ read line
+ cmd="${cmd}@$line"
+ done
+ echo "$cmd" > /tmp/bcsh$$
+ ed - /tmp/bcsh$$ << '++++'
+ 1,$s/@/\
+/g
+ g/switch.*(/s//case "/
+ s/)/" in/
+ 1,$s/case[ ]\(.*\):$/;;\
+ \1)/
+ 2d
+ 1,$s/endsw/;;\
+esac/
+ g/breaksw/s///
+ 1,$s/default.*/;;\
+ *)/
+ w
+++++
+ cmd="`cat /tmp/bcsh$$`"
+ ;;
+ *!*)
+ hist=yes
+ ;;
+ esac
+
+ case "$hist" in
+ yes)
+ # deal with genuine exclamation marks, go back and parse again
+
+ case "$cmd" in
+ *\>![\ \ ]*|*\\!*)
+ cmd="`echo \"$cmd\" | sed -e 's@\\!@REALEXCLAMATIONMARK@g'`"
+ exclaim=yes
+ getcmd=no
+ continue
+ ;;
+ esac
+
+ # break command into elements, parse each one
+
+ tmp=
+ for i in $cmd
+ do
+ # find element with !, peel off stuff up to !
+
+ case "$i" in
+ !)
+ # most likely a typo for !!, so fix it
+ front=
+ $i=!!
+ ;;
+ !!*)
+ front=
+ i="`expr \"$i\" : '.*\(!!.*\)'`"
+ ;;
+ *!!*)
+ front="`expr \"$i\" : '\(.*\)!!.*'`"
+ i="`expr \"$i\" : '.*\(!!.*\)'`"
+ ;;
+ !*)
+ front=
+ i="`expr \"$i\" : '.*!\(.*\)'`"
+ ;;
+ *)
+ tmp="$tmp$i "
+ continue
+ ;;
+ esac
+ case "$i" in
+ !!*)
+ # want last command
+
+ rest="`expr \"$i\" : '!!\(.*\)'`"
+ i=$lastcmd
+ ;;
+ -*)
+ # we want to search back through the history list
+
+ case "$i" in
+ -)
+ rest="`expr \"$i\" : '-\(.*\)'`"
+ i=$lastcmd
+ ;;
+ -[0-9]*)
+ wanted="`expr \"$i\" : '-\([0-9][0-9]*\).*'`"
+ rest="`expr \"$i\" : '-[0-9][0-9]*\(.*\)'`"
+ i="`tail -$wanted $histfile | sed -e "1q"`"
+ ;;
+ esac
+ ;;
+ [0-9]*)
+ # find which number command is wanted
+
+ wanted="`expr \"$i\" : '\([0-9][0-9]*\).*'`"
+ rest="`expr \"$i\" : '[0-9][0-9]*\(.*\)'`"
+ i="`grep -n . $histfile | grep \"^$wanted\"`"
+ i="`expr \"$i\" : \"${wanted}.\(.*\)\"`"
+ ;;
+ \?*)
+
+ # find which 'command-contains' match is wanted
+
+ case "$i" in
+ \?{*}*)
+ wanted="`expr \"$i\" : '?{\(.*\)}.*'`"
+ rest="`expr \"$i\" : '?.*}\(.*\)'`"
+ ;;
+ \?*:*)
+ wanted="`expr \"$i\" : '?\(.*\):.*'`"
+ rest="`expr \"$i\" : '?.*\(:.*\)'`"
+ ;;
+ \?*)
+ wanted="`expr \"$i\" : '?\(.*\)'`"
+ rest=
+ ;;
+ esac
+ i="`grep \"$wanted\" $histfile | tail -1`"
+ ;;
+ *)
+ # find which 'start-of-command' match is wanted
+
+ case "$i" in
+ {*}*)
+ wanted="`expr \"$i\" : '{\(.*\)}.*'`"
+ rest="`expr \"$i\" : '.*}\(.*\)'`"
+ ;;
+ *:*)
+ wanted="`expr \"$i\" : '\(.*\):.*'`"
+ rest="`expr \"$i\" : '.*\(:.*\)'`"
+ ;;
+ *)
+ wanted="$i"
+ rest=
+ ;;
+ esac
+ i="`grep \"^$wanted\" $histfile | tail -1`"
+ ;;
+ esac
+
+ # see if we actually found anything to substitute
+
+ case "$i" in
+ "")
+ badsub="Event not found"
+ break
+ ;;
+ *)
+ badsub=no
+ ;;
+ esac
+
+ case "$rest" in
+ "")
+ tmp="$front$tmp$i "
+ continue
+ ;;
+ :[0-9]*)
+ # find which element of $i is wanted
+
+ number="`expr \"$rest\" : ':\([0-9][0-9]*\).*'`"
+ rest="`expr \"$rest\" : ':[0-9][0-9]*\(.*\)'`"
+
+ # count through $i till we get to the
+ # right element
+
+ counter=0
+ for element in $i
+ do
+ case "$counter" in
+ $number)
+ break
+ ;;
+ *)
+ counter="`expr \"$counter\" + 1`"
+ # counter=$[ $counter + 1 ]
+ ;;
+ esac
+ done
+ case "$counter" in
+ $number)
+ badsub=no
+ ;;
+ *)
+ badsub="Bad command element"
+ break
+ ;;
+ esac
+ tmp="$tmp$front$element$rest "
+ continue
+ ;;
+ :\$*)
+ # spin through $i till we hit the last element
+
+ rest="`expr \"$rest\" : ':\$\(.*\)'`"
+ for element in $i
+ do
+ :
+ done
+ tmp="$tmp$front$element$rest "
+ continue
+ ;;
+ :\**)
+ # we want all elements except the command itself
+
+ rest="`expr \"$rest\" : ':\*\(.*\)'`"
+ save=$i
+ set - $i
+ shift
+ case "$*" in
+ "")
+ badsub="No arguments to command '$save'"
+ break
+ ;;
+ *)
+ badsub=no
+ ;;
+ esac
+ tmp="$tmp$front$*$rest "
+ continue
+ ;;
+ :s*|:gs*)
+ # we are doing a substitution
+ # put / on end if needed
+
+ case "$rest" in
+ :s/*/*/*|:gs/*/*/*)
+ ;;
+ :s/*/*|:gs/*/*)
+ rest="${rest}/"
+ ;;
+ esac
+
+ # find what substitution is wanted
+
+ first="`expr \"$rest\" : ':*s\/\(.*\)\/.*\/.*'`"
+ second="`expr \"$i\" : ':*s/.*/\(.*\)/.*'`"
+
+ # see if it is a global substitution
+
+ case "$rest" in
+ :gs*)
+ global=g
+ ;;
+ :s*)
+ global=
+ ;;
+ esac
+ rest="`expr \"$rest\" : '.*/.*/.*/\(.*\)'`"
+ i="`echo \"$i\" | sed -e \"s@$first@$second@$global\"`"
+
+ # see if subsitution worked
+
+ case "$i" in
+ "")
+ badsub="Substiution failed"
+ break
+ ;;
+ *)
+ badsub=no
+ ;;
+ esac
+ tmp="$tmp$front$i$rest "
+ continue
+ ;;
+ *)
+ tmp="$tmp$front$i$rest "
+ ;;
+ esac
+ done
+ case "$badsub" in
+ no)
+ ;;
+ *)
+ echo "$badsub"
+ badsub=no
+ continue
+ ;;
+ esac
+ cmd="$tmp"
+ echoit=yes
+ getcmd=no
+ continue
+ ;;
+ *)
+ run=yes
+ ;;
+ esac
+
+ case "$cmd" in
+ *\^*\^*\^*)
+ # see if the substitution is global
+ case "$cmd" in
+ g*)
+ global=g
+ ;;
+ *)
+ global=
+ ;;
+ esac
+
+ # put a '^' on the end if necessary
+ case "$cmd" in
+ *\^)
+ ;;
+ *)
+ cmd="${cmd}^"
+ ;;
+ esac
+
+ # find what substitution is wanted
+
+ first="`expr \"$cmd\" : '*\^\(.*\)\^.*\^.*'`"
+ second="`expr \"$cmd\" : '*\^.*\^\(.*\)\^.*'`"
+ rest="`expr \"$cmd\" : '*\^.*\^.*\^\(.*\)'`"
+ cmd="`echo \"$lastcmd\" | sed -e \"s@$first@$second@$global\"`$rest"
+
+ # see if the substitution worked
+
+ case "$cmd" in
+ "")
+ echo "Substitution failed"
+ continue
+ ;;
+ esac
+ echoit=yes
+ getcmd=no
+ continue
+ ;;
+ *~e)
+ echo "$cmd" | sed -e "s@~e@@" > /tmp/bcsh$$
+ $EDITOR /tmp/bcsh$$
+ cmd="`cat /tmp/bcsh$$`"
+ getcmd=no
+ continue
+ ;;
+ *~v)
+ echo "$cmd" | sed -e "s@~v@@" > /tmp/bcsh$$
+ echo "$lastcmd" > /tmp/bcsh$$
+ $VISUAL /tmp/bcsh$$
+ cmd="`cat /tmp/bcsh$$`"
+ getcmd=no
+ continue
+ ;;
+ exec[\ \ ]*)
+ tail -$savehist $histfile>/tmp/hist$$
+ uniq /tmp/hist$$ > $histfile
+ rm -f /tmp/*$$
+ echo $cmd > /tmp/cmd$$
+ . /tmp/cmd$$
+ ;;
+ login[\ \ ]*|newgrp[\ \ ]*)
+ tail -$savehist $histfile>/tmp/hist$$
+ uniq /tmp/hist$$ > $histfile
+ rm -f /tmp/*$$
+ echo $cmd > /tmp/cmd$$
+ . /tmp/cmd$$
+ ;;
+ logout|exit|bye)
+ if test -s "$logoutfile"
+ then
+ # sh $logoutfile
+ $SHELL $logoutfile
+ fi
+ tail -$savehist $histfile > /tmp/hist$$
+ uniq /tmp/hist$$ > $histfile
+ rm -f /tmp/*$$
+ exit 0
+ ;;
+ h|history)
+ grep -n . $histfile | tail -$history | sed -e 's@:@ @' | $PAGER
+ continue
+ ;;
+ h[\ \ ]\|*|h[\ \ ]\>*|h\|*|h\>*)
+ cmd="`echo \"$cmd\" | sed -e \"s@h@grep -n . $histfile | tail -$history | sed -e 's@:@ @'@\"`"
+ getcmd=no
+ continue
+ ;;
+ history[\ \ ]*\|*|history[\ \ ]*\>*)
+ cmd="`echo \"$cmd\" | sed -e \"s@history@grep -n . $histfile | tail -$history | sed -e 's@:@ @'@\"`"
+ getcmd=no
+ continue
+ ;;
+ source[\ \ ]*)
+ set - $cmd
+ shift
+ echo . $* > /tmp/cmd$$
+ . /tmp/cmd$$
+ run=no
+ ;;
+ wait)
+ wait
+ run=no
+ ;;
+ .[\ \ ]*)
+ echo $cmd > /tmp/cmd$$
+ . /tmp/cmd$$
+ run=no
+ ;;
+ cd|cd[\ \ ]*)
+ # check if it will work first, or else this shell will terminate
+ # if the cd dies. If you have a built-in test, you might want
+ # to replace the try-it-and-see below with a couple of tests,
+ # but it is probably just as fast like this.
+
+ echo $cmd > /tmp/cmd$$
+ if ($SHELL /tmp/cmd$$) ; then
+ . /tmp/cmd$$
+ fi
+ run=no
+ ;;
+ awk[\ \ ]*|dd[\ \ ]*|cc[\ \ ]*|make[\ \ ]*)
+ # these are the only commands I can think of whose syntax
+ # includes an equals sign. Add others as you find them.
+
+ echo "$cmd" > /tmp/bcsh$$
+ ;;
+ setenv*|*=*)
+ # handle setting shell variables, turning cshell syntax to Bourne
+ # syntax -- note all variables must be exported or they will not
+ # be usable in other commands
+
+ echo "$cmd" > /tmp/cmd$$
+ ed - /tmp/cmd$$ << ++++
+ g/^setenv[ ]/s/[ ]/@/
+ g/^setenv@/s/[ ]/=/
+ g/^setenv@/s///
+ g/^set/s///
+ .t.
+ \$s/=.*//
+ s/^/export /
+ w
+++++
+ . /tmp/cmd$$
+ rm -f /tmp/cmd$$
+ run=no
+ ;;
+ unset[\ \ ]*|umask[\ \ ]*|export[\ \ ]*|set[\ \ ]*)
+ # handle commands which twiddle current environment
+
+ $cmd
+ run=no
+ ;;
+ alias|alias[\ \ ])
+ if [ -f $aliasfile ]; then
+ $PAGER $aliasfile
+ fi
+ lastcmd=$cmd
+ run=no
+ continue
+ ;;
+ alias[\ \ ]*)
+ case "$cmd" in
+ alias[\ \ ]\|*|alias[\ \ ]\>*)
+ cmd="`echo \"$cmd\" | sed -e \"s@alias@cat $aliasfile@\"`"
+ getcmd=no
+ continue
+ ;;
+ alias[\ \ ]*[\ \ ]*)
+ ;;
+ *)
+ echo "Syntax: alias name command"
+ cmd=
+ continue
+ ;;
+ esac
+ set - $cmd
+ shift
+ cmd="$*"
+
+ # make sure there is always 1 blank line in file so
+ # unaliasing will always work -- ed normally refuses
+ # to write an empty file
+ echo "" >> $aliasfile
+ cat << ++++ >> $aliasfile
+$cmd
+++++
+
+# ed - $aliasfile << '++++'
+# g/alias[ ]/s///
+# g/^['"]\(.*\)['"]$/s//\1/
+# g/^/s//alias /
+# w
+#++++
+
+ sort -u -o $aliasfile $aliasfile
+ doalias=yes
+ cmd="alias $cmd"
+ run=no
+ ;;
+ unalias[\ \ ]*)
+ set - $cmd
+ case "$#" in
+ 2)
+ cmd=$2
+ ;;
+ *)
+ echo "Syntax: unalias alias_name"
+ continue
+ ;;
+ esac
+ ed - $aliasfile << ++++
+ /^$cmd[ ]/d
+ w
+++++
+ case "`set - \`wc -l $aliasfile\`;echo $1`" in
+ 1)
+ # just removed last alias
+ doalias=no
+ ;;
+ esac
+ run=no
+ ;;
+ *)
+ case "$doalias" in
+ yes)
+ set - $cmd
+ tmp="`grep \"^$1 \" $aliasfile`"
+ case "$tmp" in
+ $1[\ \ ]*)
+ shift
+ cmd=$*
+ set - $tmp
+ shift
+ tmp=$*
+ case "$tmp" in
+ *\$*)
+ # uses positional variables
+
+ cmd="set - $cmd ; $tmp"
+ getcmd=no
+ continue
+ ;;
+ *)
+ cmd="$tmp $cmd"
+ getcmd=no
+ continue
+ ;;
+ esac
+ ;;
+ *)
+ echo "$cmd" > /tmp/bcsh$$
+ ;;
+ esac
+ ;;
+ no)
+ echo "$cmd" > /tmp/bcsh$$
+ ;;
+ esac
+ ;;
+ esac
+
+ case "$cmd" in
+ *+~+p)
+ cmd="`expr \"$cmd\" : '\(.*\)+~+p'`"
+ echoit=yes
+ run=no
+ ;;
+ esac
+
+ case "$cmd" in
+ "")
+ continue
+ ;;
+ *)
+ case "$exclaim" in
+ yes)
+ cmd="`echo \"$cmd\" | sed -e 's@REALEXCLAMATIONMARK@!@g'`"
+ echo "$cmd" > /tmp/bcsh$$
+ ;;
+ esac
+ case "$echoit" in
+ yes)
+ echo $cmd
+ ;;
+ esac
+ case "$run" in
+ yes)
+ case "${noclobber+yes}" in
+ yes)
+ case "$cmd" in
+ *\>![\ \ ]*)
+ ed - /tmp/bcsh$$ << ++++
+ g/>!/s//>/
+ w
+++++
+ ;;
+ *\>\>*)
+ ;;
+ *\>*)
+ outfile="`expr \"$cmd\" : '.*>\(.*\)'`"
+ case "$outfile" in
+ \&*)
+ ;;
+ *)
+ set - $outfile
+ outfile="$1"
+ if test -s "$outfile"
+ then
+ case "${iclobber+yes}" in
+ yes)
+ echo $n "Overwrite ${outfile}? $c"
+ read answer
+ case "$answer" in
+ y*)
+ ;;
+ *)
+ echo ':' > /tmp/bcsh$$
+ ;;
+ esac
+ ;;
+ *)
+ echo "${outfile}: file exists"
+ echo ':' > /tmp/bcsh$$
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ *)
+ case "$cmd" in
+ *\>![\ \ ]*)
+ ed - /tmp/bcsh$$ << ++++
+ g/>!/s//>/g
+ w
+++++
+ ;;
+ esac
+ ;;
+ esac
+ (trap 'exit 1' 2 3; $BASH /tmp/bcsh$$)
+ ;;
+ esac
+ case "$cmd" in
+ $lastcmd)
+ ;;
+ *)
+ case "$exclaim" in
+ yes)
+ cmd="`echo \"$cmd\" | sed -e 's@!@\\\\!@g'`"
+ ;;
+ esac
+
+ cat << ++++ >> $histfile
+$cmd
+++++
+ lastcmd=$cmd
+
+ case "$inc_cmdno" in
+ yes)
+ cmdno="`expr \"$cmdno\" + 1`"
+ # cmdno=$[$cmdno + 1]
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+
+ # The next commented-out line sets the prompt to include the command
+ # number -- you should only un-comment this if it is the ONLY thing
+ # you ever want as your prompt, because it will override attempts
+ # to set PS1 from the command level. If you want the command number
+ # in your prompt without sacrificing the ability to change the prompt
+ # later, replace the default setting for PS1 before the beginning of
+ # the main loop with the following: PS1='echo -n "${cmdno}% "'
+ # Doing it this way is, however, slower than the simple version below.
+
+ PS1="${cmdno}% "
+
+ getcmd=yes
+ echoit=no
+ exclaim=no
+done
+exit 0
+
+# Christine Robertson {linus, ihnp4, decvax}!utzoo!globetek!chris
diff --git a/examples/scripts/precedence b/examples/scripts/precedence
new file mode 100644
index 00000000..9bbdb971
--- /dev/null
+++ b/examples/scripts/precedence
@@ -0,0 +1,75 @@
+# @(#)precedence_test 1.0 91/07/24 Maarten Litmaath
+# test of relative precedences for `&&' and `||' operators
+
+echo "\`Say' echos its argument. Its return value is of no interest."
+case `echo -n` in
+ '') Say () { echo -n "$*" ; } ;;
+ *) Say () { echo "$*\c" ; } ;;
+esac
+
+echo "\`Truth' echos its argument and returns a TRUE result."
+Truth () {
+ Say $1;
+ return 0;
+}
+
+echo "\`False' echos its argument and returns a FALSE result."
+False () {
+ Say $1;
+ return 1;
+}
+
+echo ""
+
+cmd1='$open $test1 && $test2 $close || $test3'
+cmd2='$test1 || $open $test2 && $test3 $close'
+
+grouping_sh=
+grouping_C='( )'
+
+test3='Say 3'
+
+for i in 1 2
+do
+ eval proto=\$cmd$i
+
+ for test1 in 'Truth 1' 'False 1'
+ do
+ for test2 in 'Truth 2' 'False 2'
+ do
+ for precedence in sh C
+ do
+ eval set x \$grouping_$precedence
+ shift
+ open=${1-' '}
+ close=${2-' '}
+ eval cmd=\""$proto"\"
+ Say "$cmd output="
+ output=`eval "$cmd"`
+ Say "$output"
+ read correct || { echo 'Input fubar. Abort.' >&2; exit 1; }
+ test "X$output" = "X$correct" || echo " correct=$correct"
+ echo ''
+ done
+
+ echo ''
+ done
+ done
+done << EOF
+12
+12
+123
+123
+13
+13
+13
+13
+13
+1
+13
+1
+123
+123
+12
+12
+EOF
diff --git a/examples/scripts/shprompt b/examples/scripts/shprompt
new file mode 100755
index 00000000..ec8b997a
--- /dev/null
+++ b/examples/scripts/shprompt
@@ -0,0 +1,137 @@
+#
+# shprompt -- give a prompt and get an answer satisfying certain criteria
+#
+# shprompt [-dDfFsy] prompt
+# s = prompt for string
+# f = prompt for filename
+# F = prompt for full pathname to a file or directory
+# d = prompt for a directory name
+# D = prompt for a full pathname to a directory
+# y = prompt for y or n answer
+#
+# Chet Ramey
+# chet@ins.CWRU.Edu
+
+type=file
+
+OPTS=dDfFsy
+
+succeed()
+{
+ echo "$1"
+ exit 0
+}
+
+while getopts "$OPTS" c
+do
+ case "$c" in
+ s) type=string
+ ;;
+ f) type=file
+ ;;
+ F) type=path
+ ;;
+ d) type=dir
+ ;;
+ D) type=dirpath
+ ;;
+ y) type=yesno
+ ;;
+ ?) echo "usage: $0 [-$OPTS] prompt" 1>&2
+ exit 2
+ ;;
+ esac
+done
+
+if [ "$OPTIND" -gt 1 ] ; then
+ shift $[$OPTIND - 1]
+fi
+
+while :
+do
+ case "$type" in
+ string)
+ echo -n "$1" 1>&2
+ read ans || exit 1
+ if [ -n "$ans" ] ; then
+ succeed "$ans"
+ fi
+ ;;
+ file|path)
+ echo -n "$1" 1>&2
+ read ans || exit 1
+ #
+ # use `fn' and eval so that bash will do tilde expansion for
+ # me
+ #
+ eval fn="$ans"
+ case "$fn" in
+ /*) if test -e "$fn" ; then
+ succeed "$fn"
+ else
+ echo "$0: '$fn' does not exist" 1>&2
+ fi
+ ;;
+ *) if [ "$type" = "path" ] ; then
+ echo "$0: must give full pathname to file" 1>&2
+ else
+ if test -e "$fn" ; then
+ succeed "$fn"
+ else
+ echo "$0: '$fn' does not exist" 1>&2
+ fi
+ fi
+ ;;
+ esac
+ ;;
+ dir|dirpath)
+ echo -n "$1" 1>&2
+ read ans || exit 1
+ #
+ # use `fn' and eval so that bash will do tilde expansion for
+ # me
+ #
+ eval fn="$ans"
+ case "$fn" in
+ /*) if test -d "$fn" ; then
+ succeed "$fn"
+ elif test -e "$fn" ; then
+ echo "$0 '$fn' is not a directory" 1>&2
+ else
+ echo "$0: '$fn' does not exist" 1>&2
+ fi
+ ;;
+ *) if [ "$type" = "dirpath" ] ; then
+ echo "$0: must give full pathname to directory" 1>&2
+ else
+ if test -d "$fn" ; then
+ succeed "$fn"
+ elif test -e "$fn" ; then
+ echo "$0 '$fn' is not a directory" 1>&2
+ else
+ echo "$0: '$fn' does not exist" 1>&2
+ fi
+ fi
+ ;;
+ esac
+ ;;
+ yesno)
+ echo -n "$1" 1>&2
+ read ans || exit 1
+ case "$ans" in
+ y|Y|[yY][eE][sS])
+ succeed "yes"
+ ;;
+ n|N|[nN][oO])
+ succeed "no"
+ exit 0
+ ;;
+ *)
+ echo "$0: yes or no required" 1>&2
+ ;;
+ esac
+ ;;
+ esac
+done
+
+exit 1
diff --git a/examples/startup-files/Bash_aliases b/examples/startup-files/Bash_aliases
new file mode 100644
index 00000000..012ad5ca
--- /dev/null
+++ b/examples/startup-files/Bash_aliases
@@ -0,0 +1,63 @@
+# Some useful aliases.
+alias texclean='rm -f *.toc *.aux *.log *.cp *.fn *.tp *.vr *.pg *.ky'
+alias clean='echo -n "Really clean this directory?";
+ read yorn;
+ if test "$yorn" = "y"; then
+ rm -f \#* *~ .*~ *.bak .*.bak *.tmp .*.tmp core a.out;
+ echo "Cleaned.";
+ else
+ echo "Not cleaned.";
+ fi'
+alias h='history'
+alias j="jobs -l"
+alias l="ls -l "
+alias ll="ls -l"
+alias ls="ls -F"
+alias term='set noglob; eval `tset -Q -s `'
+alias pu="pushd"
+alias po="popd"
+
+#
+# Csh compatability:
+#
+alias unsetenv=unset
+function setenv () {
+ export $1="$2"
+}
+
+# Function which adds an alias to the current shell and to
+# the ~/.bash_aliases file.
+add-alias ()
+{
+ local name=$1 value="$2"
+ echo alias $name=\'$value\' >>~/.bash_aliases
+ eval alias $name=\'$value\'
+ alias $name
+}
+
+# "repeat" command. Like:
+#
+# repeat 10 echo foo
+repeat ()
+{
+ local count="$1" i;
+ shift;
+ for i in $(seq 1 "$count");
+ do
+ eval "$@";
+ done
+}
+
+# Subfunction needed by `repeat'.
+seq ()
+{
+ local lower upper output;
+ lower=$1 upper=$2;
+ while [ $lower -le $upper ];
+ do
+ output="$output $lower";
+ lower=$[ $lower + 1 ];
+ done;
+ echo $output
+}
+
diff --git a/examples/startup-files/Bash_profile b/examples/startup-files/Bash_profile
new file mode 100644
index 00000000..b1b24c0a
--- /dev/null
+++ b/examples/startup-files/Bash_profile
@@ -0,0 +1,20 @@
+# Startup file for bash login shells.
+#
+default_dir=/usr/local/lib/
+
+if [ "$PS1" ]; then
+ PS1='\u@\h(\#)$ '
+ ignoreeof=3
+fi
+
+LOGIN_SHELL=true
+
+# If the user has her own init file, then use that one, else use the
+# canonical one.
+if [ -f ~/.bashrc ]; then
+ source ~/.bashrc
+else if [ -f ${default_dir}Bashrc ]; then
+ source ${default_dir}Bashrc;
+ fi
+fi
+
diff --git a/examples/startup-files/Bashrc b/examples/startup-files/Bashrc
new file mode 100644
index 00000000..935bff82
--- /dev/null
+++ b/examples/startup-files/Bashrc
@@ -0,0 +1,72 @@
+# Bourne Again SHell init file.
+#
+# Files you make look like rw-rw-r
+umask 002
+
+# Don't make useless coredump files. If you want a coredump,
+# say "ulimit -c unlimited" and then cause a segmentation fault.
+ulimit -c 0
+
+# Sometimes, there are lots of places that one can find tex inputs.
+export TEXINPUTS=.:$HOME/bin:/usr/lib/tex/inputs:/usr/local/lib/tex/inputs
+
+# Where's the Gnu stuff at?
+GNU=/usr/gnu/bin
+X11=/usr/bin/X11
+
+UTIL_PATH=$GNU:$X11
+STANDARD_PATH=/usr/local/bin:/usr/ucb:/bin:/usr/bin:/usr/etc:/etc:/usr/games
+if [ "$HOSTTYPE" = "sony" ]; then STANDARD_PATH=STANDARD_PATH:/usr/sony/bin; fi
+
+if [ -d $HOME/bin/$HOSTTYPE ]; then
+ MY_PATH=$HOME/bin/$HOSTTYPE
+fi
+
+if [ -d $HOME/bin ]; then
+ MY_PATH=$MY_PATH:$HOME/bin
+fi
+
+if [ -d /usr/hosts ]; then
+ STANDARD_PATH=$STANDARD_PATH:/usr/hosts
+fi
+
+PATH=.:$MY_PATH:$UTIL_PATH:$STANDARD_PATH
+
+# If running interactively, then:
+if [ "$PS1" ]; then
+
+ # Set ignoreeof if you don't want EOF as the sole input to the shell to
+ # immediately signal a quit condition. This only happens at the start
+ # of a line if the line is empty, and you haven't just deleted a character
+ # with C-d. I turn this on in ~/.bash_profile so that only login shells
+ # have the right to be obnoxious.
+ # ignoreeof=
+
+ # Set auto_resume if you want to resume on "emacs", as well as on
+ # "%emacs".
+ auto_resume=
+
+ # Set notify if you want to be asynchronously notified about background
+ # job completion.
+ notify=
+
+ # Make it so that failed `exec' commands don't flush this shell.
+ no_exit_on_failed_exec=
+
+ if [ ! "$LOGIN_SHELL" ]; then
+ PS1="\u@\h\$ "
+ fi
+
+ HISTSIZE=256
+ MAILCHECK=60
+
+ # A couple of default aliases.
+ alias j='jobs -l'
+ alias po=popd
+ alias pu=pushd
+ alias ls='ls -F'
+
+ if [ -f ~/.bash_aliases ]; then
+ source ~/.bash_aliases
+ fi
+fi
diff --git a/examples/startup-files/bash-profile b/examples/startup-files/bash-profile
new file mode 100644
index 00000000..01c322aa
--- /dev/null
+++ b/examples/startup-files/bash-profile
@@ -0,0 +1,54 @@
+HOME=/usr/homes/chet
+MAIL=/usr/homes/chet/mbox
+MAILCHECK=30
+HISTFILE=/usr/homes/chet/.history
+
+MACHINE=$(/usr/local/bin/machine)
+HOST=$(hostname)
+
+PATH1=/usr/homes/chet/bin.$MACHINE:/usr/local/bin/gnu:
+PATH2=/usr/local/bin:/usr/ucb:/bin:/usr/bin/X11:.
+PATH3=/usr/andrew/bin:/usr/bin:/usr/ibm:/usr/local/bin/mh:/usr/new/bin:
+PATH=$PATH1:$PATH2:$PATH3
+
+EDITOR=/usr/homes/chet/bin.$MACHINE/ce
+VISUAL=/usr/homes/chet/bin.$MACHINE/ce
+FCEDIT=/usr/homes/chet/bin.$MACHINE/ce
+
+if [ "$BASH" ] ; then
+ SHELL=$BASH
+else
+ SHELL=/bin/bash
+fi
+
+if [ "$MACHINE" = "ibm032" ] ; then
+ stty erase ^H
+fi
+
+PAGER=/usr/ucb/more
+NNTPSERVER=kiwi
+NS=/nfs/cwjcc/fs1/ns-engr/proj/netsrv/cwpub/proto/src
+
+#
+# Bogus 1003.2 variables. This should really be in /etc/profile
+#
+LOGNAME=${USER-$(whoami)}
+TZ=EST5EDT
+
+export HOME ENV VISUAL EDITOR MAIL SHELL PATH TERM
+export PAGER LESS TERMCAP HISTSZIE HISTFILE
+export MAIL MAILCHECK HOST HOSTNAME NNTPSERVER NS LOGNAME TZ
+
+PS1="${HOST}$ "
+PS2='> '
+export PS1 PS2
+
+umask 022
+
+if [ -f /unix ] ; then
+ stty intr ^c
+fi
+
+if [ -f ~/.bashrc ] ; then
+ . ~/.bashrc
+fi
diff --git a/examples/startup-files/bashrc b/examples/startup-files/bashrc
new file mode 100644
index 00000000..5363e583
--- /dev/null
+++ b/examples/startup-files/bashrc
@@ -0,0 +1,139 @@
+if [ "$PS1" != "" ] ; then
+
+if [ -f /unix ] ; then
+ alias ls='/bin/ls -CF'
+ alias ll='/bin/ls -lCF'
+ alias dir='/bin/ls -bCalF'
+else
+ alias ls='/bin/ls -F'
+ alias ll='/bin/ls -lF'
+ alias dir='/bin/ls -balF'
+fi
+
+alias ss="ps -aux"
+alias mail=/usr/ucb/mail
+alias dot='ls .[a-zA-Z0-9]*'
+alias mroe=more
+alias pwd='echo $PWD'
+alias pdw='echo $PWD'
+alias news="xterm -g 80x45 -e rn -e &"
+alias back='cd $OLDPWD'
+alias manroff="nroff /usr/lib/tmac/tmac.an.4.3"
+alias laser="lpr -Palw2"
+alias lw="lpr -Palw2"
+alias c="clear"
+alias m="more"
+alias j="jobs"
+
+if [ -z "$HOST" ] ; then
+ export HOST=`hostname`
+fi
+
+history_control=ignoredups
+
+psgrep()
+{
+ ps -aux | grep $1 | grep -v grep
+}
+
+#
+# This is a little like `zap' from Kernighan and Pike
+#
+
+pskill()
+{
+ local pid
+
+ pid=$(ps -ax | grep $1 | grep -v grep | awk '{ print $1 }')
+ echo -n "killing $1 (process $pid)..."
+ kill -9 $pid
+ echo "slaughtered."
+}
+
+term()
+{
+ TERM=$1
+ export TERM
+ tset
+}
+
+cd()
+{
+ builtin cd $*
+ xtitle $HOST: $PWD
+}
+
+bold()
+{
+ tput smso
+}
+
+unbold()
+{
+ tput rmso
+}
+
+if [ -f /unix ] ; then
+clear()
+{
+ tput clear
+}
+fi
+
+rot13()
+{
+ if [ $# = 0 ] ; then
+ tr "[a-m][n-z][A-M][N-Z]" "[n-z][a-m][N-Z][A-M]"
+ else
+ tr "[a-m][n-z][A-M][N-Z]" "[n-z][a-m][N-Z][A-M]" < $1
+ fi
+}
+
+watch()
+{
+ if [ $# -ne 1 ] ; then
+ tail -f nohup.out
+ else
+ tail -f $1
+ fi
+}
+
+#
+# Remote login passing all 8 bits (so meta key will work)
+#
+rl()
+{
+ rlogin $* -8
+}
+
+function setenv()
+{
+ if [ $# -ne 2 ] ; then
+ echo "setenv: Too few arguments"
+ else
+ export $1="$2"
+ fi
+}
+
+function chmog()
+{
+ if [ $# -ne 4 ] ; then
+ echo "usage: chmog mode owner group file"
+ return 1
+ else
+ chmod $1 $4
+ chown $2 $4
+ chgrp $3 $4
+ fi
+}
+
+#
+# Source kshenv for ksh-compatibility definitions
+#
+
+if [ -f ~/.kshenv ] ; then
+ . ~/.kshenv
+fi
+
+fi
+#end of .bashrc
diff --git a/examples/suncmd.termcap b/examples/suncmd.termcap
new file mode 100644
index 00000000..c3422fb4
--- /dev/null
+++ b/examples/suncmd.termcap
@@ -0,0 +1,30 @@
+#Posted-Date: Fri, 9 Mar 90 18:34:29 EST
+#Date: Fri, 9 Mar 90 18:34:29 EST
+#From: "Eirik Fuller" <wonton.tn.cornell.edu!eirik@ucsbcsl.UUCP>
+#To: bfox@ai.mit.edu (Brian Fox)
+#Subject: Patch to bash 1.05 for SunView
+#
+#I think this works:
+#
+Mu|sun-cmd:am:bs:km:pt:li#34:co#80:cl=^L:ce=\E[K:cd=\E[J:rs=\E[s:
+#
+#Another alternative is to send the ti string at startup time (and, I
+#guess, the te string at exit time); that is how vi works in a cmdtool.
+#The best reason to not do this is that this also disables scrolling
+#which, as I understand it, is why anyone would use cmdtool in the
+#first place. Sending the ti string at startup time would do strange
+#things on other systems too; in xterm it would use the alternate
+#screen.
+#
+#The problem with cmdtool, in case that is less than obvious, is that
+#almost none of the capabilities advertised in /etc/termcap are enabled
+#while scrolling is enabled. It has other problems too, like being
+#part of an outdated proprietary windowing system, but there's probably
+#no need to dwell on that. In a sense, though, the sun-cmd termcap
+#entry doesn't lie about the capabilities; I think the termcap man page
+#does warn about some terminals having cursor motion capabilities only
+#in the "ti/te window".
+#
+#A general solution to this problem would require a termcap capability
+#which somehow tells which features are available outside of the ti/te
+#window. There is no such capability in termcap now, of course.