NetBSD-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: How do you set $PS1 on /bin/ksh



Ottavio Caruso wrote in <CAEJNuHymoGWLryUFeLYF_AH-qfed1ymvayhByFsbV+-9WX\
oP=Q%mail.gmail.com@localhost>:
 |Hi,
 |
 |[hoping my post doesn't arrive duplicated or triplicated]
 |
 |How do you set the prompt in ksh? The man page doesn't seem to help.
 |OpenBSD ksh has a different manpage. Compare:
 |https://man.openbsd.org/ksh.1#PS1
 |and
 |https://netbsd.gw.com/cgi-bin/man-cgi?ksh
 |
 |For example:
 |PS1="\u@\h:\w\$ "
 |
 |is not expanded.

These things are totally non-portable.  I setup a shell
environment with some basics via ~/.profile (that is made to be
found by all shells), and then interactive ~/.shrc (symlinked so
to be found the way the shell(s) want it).  And that uses the
basic environment, for example $OSTYPE, $HOSTNAME etc., to create
a shell prompt via variables.

Somewhat heavily stripped (and embedded in a .profile environment)

eval "___isinc=\$___SHRC$$"
  [ -z "${___isinc}" ] && {
     eval "___SHRC${$}=YES"
     export ___SHRC${$}
     case ${-} in
     *i*|*m*)
...
        # Determine shell type; aux while there
        ps1s= ps1S= ps1e= ps1W=
        case "${0}" in
        *ksh*)
           unset BASH_VERSION ___MKSH
           ___SHTYPE=ksh
           if [ "${KSH_VERSION}" != "${KSH_VERSION%%MIRBSD*}" ]; then
              export ___MKSH=YES
              eval "ps1s=\$'\e[31m' ps1S=\$'\e[38;5;203m' ps1e=\$'\e[0m'"
              # There were some problems in between..
              if [ "${KSH_VERSION}" != "${KSH_VERSION%%R4[0-6]*}" ]; then
                 trap 'echo; echo INTERRUPT' INT
                 ___do_exit() {
                    trap ___on_exit EXIT
                    unalias exit
                    exit
                 }
                 trap -- EXIT
                 set -o ignoreeof
                 alias exit=___do_exit
              fi
              bind ^O=delete-word-forward
           else
              ps1s="" ps1S="" ps1e="" # XXX \e <> OpenBSD?

I think newer OpenBSD has support for \[..\], but i may be
mistaken.  This code is very (, very) old.

           fi
           ;;
        *bash*)
           unset KSH_VERSION ___MKSH
           ___SHTYPE=bash
           ps1s="\[\e[31m\]" ps1S="\[\e[38;5;203m\]" ps1e="\[\e[0m\]"
           shopt login_shell >/dev/null 2>&1 && trap -- EXIT
           ;;
        *yash*)
           unset BASH_VERSION KSH_VERSION ___MKSH
           ___SHTYPE=yash
           ps1s="\[\e[31m\]" ps1S="\[\e[38;5;203m\]" ps1e="\[\e[0m\]"
           set -o emacs
           ;;
        *)
           unset KSH_VERSION ___MKSH BASH_VERSION
           ___SHTYPE=
           # /bin/sh may be some BSD ash(1)
           if [ "${OSTYPE}" = freebsd ] || [ "${OSTYPE}" = dragonfly ]; then
              ps1W='\W'
           fi
           ;;
        esac
        export ___SHTYPE
...
        # Prompts are very complicated to get
        case "${TERM}" in
        *dumb*) ps1s= ps1S= ps1e=;;
        *256color*) ps1s=$ps1S;;
        *)
           if command -v tput >/dev/null 2>&1 &&
                 ( [ "`tput colors`" -ge 256 ] ); then
              ps1s=$ps1S
           fi
           ;;
        esac
        [ "${UID}" -eq 0 ] && PS1='#' || PS1='$'
        if ( [ "${HISTSIZE##84}" = 42 ] ) > /dev/null 2>&1 ; then
           # bash(1)/*ksh(1)?
           if [ -n "${___SHTYPE}" ]; then
              PS1="${ps1s}#?\$?|${HOSTNAME%%.*}:\${PWD##*/}${PS1}${ps1e} "
           else
              PS1="${ps1s}#${HOSTNAME%%.*}:${ps1W}${PS1}${ps1e} "
           fi
        else
           PS1="${ps1s}#${HOSTNAME}${PS1}${ps1e} "
        fi
        PS2='> '
        export PS1 PS2
...

 |Thanks

What a mess.

 |-- 
 |Ottavio Caruso
 --End of <CAEJNuHymoGWLryUFeLYF_AH-qfed1ymvayhByFsbV+-9WXoP=Q@mail.gmail\
 .com>

--steffen
|
|Der Kragenbaer,                The moon bear,
|der holt sich munter           he cheerfully and one by one
|einen nach dem anderen runter  wa.ks himself off
|(By Robert Gernhardt)


Home | Main Index | Thread Index | Old Index