Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Differrent prompt for remote machines
- X-seq: zsh-users 3784
- From: "Bart Schaefer" <schaefer@xxxxxxxxxxxxxxxxxxxxxxx>
- To: zsh-users@xxxxxxxxxx
- Subject: Re: Differrent prompt for remote machines
- Date: Sat, 31 Mar 2001 19:14:49 +0000
- In-reply-to: <E14jJc8-0002oE-00@xxxxxxxxxxxxxxxxxx>
- Mailing-list: contact zsh-users-help@xxxxxxxxxx; run by ezmlm
- References: <E14jJc8-0002oE-00@xxxxxxxxxxxxxxxxxx>
On Mar 31, 12:32pm, Zefram wrote:
} Subject: Re: Differrent prompt for remote machines
}
} Dominik Vogt wrote:
} > Basically it breaks down to detecting if the shell runs on a
} > local terminal or through a network connection.
}
} if [[ $TTY == /dev/pts/* || $TTY == /dev/tty[a-z]* ]]; then
} PS1='%n@%m> '
} else
} PS1='%n> '
} fi
That doesn't work when X11 is involved, because all X terminal emulators
appear to be running "through a network connection" even when they're on
the local machine.
As it turns out, I've been trying to solve a similar problem for another
reason (I'll resist the urge to bore you with details) and came up with
the solution below.
One remaining issue is that if you're on a university timesharing system
or the like, you're probably on /dev/tty[a-z]* even if you're just using
an ancient vt100 in the lab; but even then it should be possible to come
up with a test for "is this shell on a pseudo-terminal".
The `|| ps -lp' is for systems that insist on a leading `-' in the `ps'
options (and therefore probably don't have `w'). Maybe that's overkill.
It should be obvious that this is meant to be a shell function.
---- 8< ---- snip ---- 8< ----
emulate -L zsh
local h ps ppid=$PPID
while (( ppid > 1 ))
do
ps=("${(f)$(ps lwp$ppid 2>/dev/null || ps -lp$ppid)}")
h=($=ps[1])
ps=($=ps[2])
case "$ps" in
*sshd*)
# Shell running from ssh, probably not the local machine
PS1='%n@%m> '
break
;;
*(xterm|rxvt|dtterm|eterm|gnoterm|emacs)*)
# Shell running from an emulator, check for local displays
if [[ -n $SSH_CLIENT ]]
then
# Emulator started from ssh, probably port-forwarding
PS1='%n@%m> '
break
elif [[ $DISPLAY = ($HOST*|):* && ${HOSTDISPLAY:-$HOST} = $HOST* ]]
then
# Shell running on a local display (though could be VNC)
PS1='%n> '
break
elif [[ -n $DISPLAY ]]
then
# Shell running on a remote display
PS1='%n@%m> '
break
else
# Probably running inside a text-mode emacs
fi
;;
*login*)
# Shell running on the local console, or from rlogin or telnet
if [[ $TTY == /dev/pts/* || $TTY == /dev/tty[A-Za-z]* ]]
then
# Shell running from rlogin or telnet
PS1='%n@%m> '
else
# Shell running on local console
PS1='%n> '
fi
break
;;
*)
# Shell running from su or from some other shell or program
if [[ -n $SSH_CLIENT ]]
then
# Some ancestor is ssh, probably not local
PS1='%n@%m> '
break
fi
;;
esac
# Not enough information yet, climb the process tree
ppid=${ps[$h[(i)PPID]]:-1}
done
---- 8< ---- snip ---- 8< ----
--
Bart Schaefer Brass Lantern Enterprises
http://www.well.com/user/barts http://www.brasslantern.com
Zsh: http://www.zsh.org | PHPerl Project: http://phperl.sourceforge.net
Messages sorted by:
Reverse Date,
Date,
Thread,
Author