Ksh
Crocker H. Liu
cliu at rnd.GBA.NYU.EDU
Wed Feb 6 16:28:02 AEST 1991
In article <11688 at helios.TAMU.EDU> Brent Burton writes:
>
>In ksh, I remember the main prompt being PS1. So,
>it would be something like:
> SET PS1="MY-PROMPT\!"
>
Actually, this won't work. To get a ! in your prompt you just need to
put use two exclamation marks, !!. I'll use my prompt as an example.
Sometimes I'm nested several deep in invocations of ksh. Each time I
invoke a new ksh, I keep track of how deep I am by adding another
exclamation point to my prompt. For example, if I have just logged in
my prompt looks like:
/u/crocker>
If I now run a new ksh, the prompt changes to:
/u/crocker!>
When I exit from the ksh, the exclamation point is removed. My
~/.profile looks like:
# shell used by emacs
ESHELL=/bin/ksh; export ESHELL
# ksh startup commands file
ENV=$HOME/.env; export ENV
# I use a modified window manager, so that I can create multiple
# windows and log in to each. Each window gets its own history file.
TTY="`tty`"
HISTFILE="$HOME/.ksh`basename $TTY`"; export HISTFILE
trap "rm $HISTFILE" 0 # remove the history file on logout
# don't allow ^D for logout
case $SHELL in
*ksh) set -o ignoreeof;; # don't allow ^D for logout
esac
Since the prompt depends on the level of nesting of ksh, it is set in
the ksh commands file, ~/.env:
set +o verbose
case $- in
*i*) # interactive
set -o emacs
set -o monitor
alias h='fc -l | tail -23 | more -c
alias c='clear'
alias w='whence'
alias v='dvi3b1 /tmp/TeXzap.dvi'
# Add two exclamation marks each time ksh is invoked.
# In the prompt this shows up as one added exclamation point
level="${level}!!"; export level
# Remove one pair of exclamation points, so that the lowest level
# prompt doesn't show any exclamation points. Since the ksh invoked
# in emacs by the M-x shell command is the second level of nesting,
# one needs to remove two pairs of exclamation points to have the
# lowest level prompt not show any exclamation points.
if [ "$EMACS" ]
then PS1='$PWD'${level#!!!!}'> '
else PS1='$PWD'${level#!!}'> '
fi
;;
*) set -o errexit
;;
esac
[ "$EMACS" ] && set -o verbose
The prompt uses '$PWD' instead of "$PWD" because the latter would be
immediately evaluated when ~/.env is executed, instead of being
evaluated each time the prompt is displayed. Unlike the current
directory, the level of nesting doesn't change, so that part of the
prompt can be evaluated once and for all when the ~/.env file is run
through.
Hope this helps!
.........................................................................
Crocker Liu INTERNET: cliu at rnd.gba.nyu.edu
USENET: ...!{uunet,rocky,harvard}!cmcl2!rnd!cliu
More information about the Comp.sys.3b1
mailing list