which and PATH

Bruce Dawson jbd at codemeta.com
Fri Dec 7 11:53:03 EST 2007


Kent Johnson wrote:
> Can someone please explain this to me?
>
> kent $ which curl
> /opt/local/bin/curl
>
> So if I run curl, I should get /opt/local/bin/curl, right? But I seem to 
> get /usr/bin/curl:
>
> kent $ /opt/local/bin/curl -V
> curl 7.17.1 (i386-apple-darwin8.11.1) libcurl/7.17.1 zlib/1.2.3
>
> kent $ curl -V
> curl 7.13.1 (powerpc-apple-darwin8.0) libcurl/7.13.1 OpenSSL/0.9.7l
>
> kent $ /usr/bin/curl -V
> curl 7.13.1 (powerpc-apple-darwin8.0) libcurl/7.13.1 OpenSSL/0.9.7l
>
> /opt/local/bin is ahead of /usr/bin/ in PATH:
>
> kent $ echo $PATH$
> /Users/kent/bin:/usr/local/bin:/opt/local/bin:/opt/local/sbin:/Library/Frameworks/Python.framework/Versions/Current/bin:/bin:/sbin:/usr/bin:/usr/sbin$
>
> AFAICT there is no curl ahead of /opt/local/bin/curl in PATH:
> kent $ ls /Users/kent/bin/curl
> ls: /Users/kent/bin/curl: No such file or directory
> kent $ ls /usr/local/bin/curl
> ls: /usr/local/bin/curl: No such file or directory
> kent $ ls /opt/local/bin/curl
> /opt/local/bin/curl
>
> This is on Mac OSX, if it matters.
>
> Color me confused.
> Kent
I use the following 'which' to prevent these confusions:

: ${WHICHPATH:=$PATH}
: ${WHICHPERM:=x}
: ${WHICHNOTPERM:=d}

path=`echo $WHICHPATH | sed -e 's/:/ /g'`

for p in $path
do
for f in "$@"
do
for w in $p/$f
do
if [ -$WHICHPERM $w -a ! -$WHICHNOTPERM $w ]
then echo $w
fi
done
done
done




More information about the gnhlug-discuss mailing list