From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1278 invoked from network); 20 Apr 2002 00:59:20 -0000 Received: from sunsite.dk (130.225.247.90) by ns1.primenet.com.au with SMTP; 20 Apr 2002 00:59:20 -0000 Received: (qmail 22208 invoked by alias); 20 Apr 2002 00:59:09 -0000 Mailing-List: contact zsh-users-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 4849 Received: (qmail 22197 invoked from network); 20 Apr 2002 00:59:08 -0000 Date: Fri, 19 Apr 2002 17:59:00 -0700 (PDT) From: Bart Schaefer Sender: schaefer@ns1.sodaware.com To: Vin Shelton cc: zsh-users@sunsite.dk Subject: Re: Convert absolute paths to relative paths In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII On Fri, 19 Apr 2002, Vin Shelton wrote: > Thanks, Bart! Christoph von Stuckrad pointed out privately that if you try to use this to get a relative path to a *file*, rather than to a directory, it will go into an infinite loop. Here's a fix for that: function relative { emulate -L zsh local up=.. down [[ -d $1 ]] || 2=$1:t 1=$1:h [[ -d $1 ]] || return 1 # ! -d $up/$down accounts for symlinks in $PWD while [[ ${PWD#$1} == $PWD || ! -d $up/$down ]] do up=../$up if [[ -n $1:t ]] then down=$1:t${down:+/$down} 1=$1:h fi done print $up/$down${2:+/$2} }