246 lines
5 KiB
Text
246 lines
5 KiB
Text
#
|
|
# .kshenv -- functions and aliases to provide the beginnings of a ksh
|
|
# environment for bash.
|
|
#
|
|
# Chet Ramey
|
|
# chet@ins.CWRU.Edu
|
|
#
|
|
|
|
#
|
|
# Copyright 2002 Chester Ramey
|
|
#
|
|
# This program 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.
|
|
#
|
|
# TThis program 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 this program; if not, write to the Free Software Foundation,
|
|
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
#
|
|
# 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 -s"
|
|
alias functions="typeset -f"
|
|
alias integer="typeset -i"
|
|
alias nohup="nohup "
|
|
alias command="command "
|
|
alias stop="kill -s STOP"
|
|
alias redirect="command exec"
|
|
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 pflag fflag defarg c
|
|
local path
|
|
|
|
vflag= aflag= pflag= fflag=
|
|
path=
|
|
if [ "$#" = "0" ] ; then
|
|
echo "whence: usage: whence [-afpv] name..." >&2
|
|
return 2
|
|
fi
|
|
|
|
OPTIND=1
|
|
while getopts "avfp" c
|
|
do
|
|
case "$c" in
|
|
a) defarg=-a ;;
|
|
f) fflag=1 ;; # no-op
|
|
p) pflag=1 ;;
|
|
v) vflag=1 ;;
|
|
?) echo "whence: $1: unknown option" >&2
|
|
echo "whence: usage: whence [-afpv] name..." >&2
|
|
return 2 ;;
|
|
esac
|
|
done
|
|
|
|
shift $(( $OPTIND - 1 ))
|
|
|
|
if [ "$#" = "0" ] ; then
|
|
echo "whence: usage: whence [-afpv] name..." >&2
|
|
return 2
|
|
fi
|
|
|
|
for cmd
|
|
do
|
|
if [ "$vflag" ] ; then
|
|
if [ -z "$defarg" ]; then
|
|
builtin type $cmd | sed 1q
|
|
else
|
|
if builtin type $defarg -t $cmd | grep 'function$' >/dev/null 2>&1; then
|
|
# HAIRY awk script to suppress
|
|
# printing of function body -- could
|
|
# do it with sed, but I don't have
|
|
# that kind of time
|
|
builtin type $defarg $cmd | awk '
|
|
BEGIN {printit = 1;}
|
|
$1 == "'$cmd'" && $2 == "()" {printit=0; next; }
|
|
/^}$/ { if (printit == 0) printit=1 ; else print $0; next ; }
|
|
/.*/ { if (printit) print $0; }'
|
|
else
|
|
builtin type $defarg $cmd
|
|
fi
|
|
fi
|
|
else
|
|
path=$(builtin type $defarg -p $cmd)
|
|
if [ "$path" ] ; then
|
|
echo $path
|
|
else
|
|
case "$cmd" in
|
|
/*) echo "" ;;
|
|
*) case "$(builtin type -t $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 "$*"
|
|
#}
|
|
|
|
#
|
|
# ksh-like `cd': cd [-LP] [dir [change]]
|
|
#
|
|
cd()
|
|
{
|
|
OPTIND=1
|
|
while getopts "LP" opt
|
|
do
|
|
case $opt in
|
|
L|P) CDOPTS="$CDOPTS -$opt" ;;
|
|
*) echo "$FUNCNAME: usage: $FUNCNAME [-LP] [dir] [change]" >&2
|
|
return 2;;
|
|
esac
|
|
done
|
|
|
|
shift $(( $OPTIND - 1 ))
|
|
|
|
case $# in
|
|
0) builtin cd $CDOPTS "$HOME" ;;
|
|
1) builtin cd $CDOPTS "$@" ;;
|
|
2) old="$1" new="$2"
|
|
case "$PWD" in
|
|
*$old*) ;;
|
|
*) echo "${0##*/}: $FUNCNAME: bad substitution" >&2 ; return 1 ;;
|
|
esac
|
|
|
|
dir=${PWD//$old/$new}
|
|
|
|
builtin cd $CDOPTS "$dir" && echo "$PWD"
|
|
|
|
;;
|
|
*) echo "${0##*/}: $FUNCNAME: usage: $FUNCNAME [-LP] [dir] [change]" >&2
|
|
return 2 ;;
|
|
esac
|
|
}
|
|
|
|
#
|
|
# ksh print emulation
|
|
#
|
|
# print [-Rnprsu[n]] [-f format] [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 print to the history file
|
|
# -u n redirect output to fd n
|
|
# -f format printf "$format" "$@"
|
|
#
|
|
|
|
print()
|
|
{
|
|
local eflag=-e
|
|
local nflag= fflag= c
|
|
local fd=1
|
|
|
|
OPTIND=1
|
|
while getopts "fRnprsu:" c
|
|
do
|
|
case $c in
|
|
R) eflag= ;;
|
|
r) eflag= ;;
|
|
n) nflag=-n ;;
|
|
s) sflag=y ;;
|
|
f) fflag=y ;;
|
|
u) fd=$OPTARG ;;
|
|
p) ;;
|
|
esac
|
|
done
|
|
shift $(( $OPTIND - 1 ))
|
|
|
|
if [ -n "$fflag" ]; then
|
|
builtin printf "$@" >&$fd
|
|
return
|
|
fi
|
|
|
|
case "$sflag" in
|
|
y) builtin history -s "$*" ;;
|
|
*) builtin echo $eflag $nflag "$@" >&$fd
|
|
esac
|
|
}
|
|
|
|
# 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 ] || [ $# -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
|
|
}
|