From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10772 invoked from network); 31 Mar 2001 19:16:06 -0000 Received: from sunsite.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 31 Mar 2001 19:16:06 -0000 Received: (qmail 15223 invoked by alias); 31 Mar 2001 19:15:54 -0000 Mailing-List: contact zsh-users-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 3784 Received: (qmail 15209 invoked from network); 31 Mar 2001 19:15:53 -0000 From: "Bart Schaefer" Message-Id: <1010331191449.ZM8000@candle.brasslantern.com> Date: Sat, 31 Mar 2001 19:14:49 +0000 In-Reply-To: Comments: In reply to Zefram "Re: Differrent prompt for remote machines" (Mar 31, 12:32pm) References: X-Mailer: Z-Mail (5.0.0 30July97) To: zsh-users@sunsite.dk Subject: Re: Differrent prompt for remote machines MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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