*BSD News Article 41627


Return to BSD News archive

Path: sserve!newshost.anu.edu.au!harbinger.cc.monash.edu.au!msunews!uwm.edu!spool.mu.edu!howland.reston.ans.net!swrinde!pipex!uunet!zib-berlin.de!zrz.TU-Berlin.DE!cs.tu-berlin.de!news
From: nickel@prz.tu-berlin.de (Juergen Nickelsen)
Newsgroups: comp.os.386bsd.questions
Subject: Re: FBSD 2.0-950112: Missing "which"
Date: 26 Jan 1995 23:54:55 GMT
Organization: Technical University of Berlin, Germany
Lines: 72
Message-ID: <NICKEL.95Jan27005455@toftum.prz.tu-berlin.de>
References: <3g386a$mfq@Owl.nstn.ca>
Reply-To: nickel@cs.tu-berlin.de
NNTP-Posting-Host: toftum.prz.tu-berlin.de
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
In-reply-to: digdon@Snoopy.UCIS.Dal.Ca's message of 24 Jan 1995 12:00:10 -0400

In article <3g386a$mfq@Owl.nstn.ca> digdon@Snoopy.UCIS.Dal.Ca (Mike
Digdon) writes:

> I tend to use the "which" command quite a lot.  Before I had time to install
> bash (I just set up my machine), I had to use csh.  "which" seems to be a csh
> built-in, so I was very surprised to find that "which" stopped working once
> I was running bash.

With bash I use a modified version of which defined as a shell
function, presented by itself:

$ which which
which is a function
which () 
{ 
    local tflag;
    if [ "$1" = -a ] ; then
        tflag=-all;
        shift ;
    fi;
    if [ $# -lt 1 ] ; then
        echo usage: which command 1>&2 ;
        return 1 ;
    fi;
    while [ "$1" ];
    do
        for i in `type -type $1 | uniq`;
        do
            case $i in 
                builtin | keyword | function)
                    type $tflag $1
                ;;
                alias)
                    type $tflag $1;
                    type `type $1 |
                                sed 's/^.*\`\([^        ]*\)[   ].*$/\1/'`
                ;;
                file)
                    type -path $tflag $1
                ;;
                *)
                    type $tflag $1
                ;;
            esac;
        done;
        shift;
    done
}

It can do fine things like this:

$ which l
l is aliased to `ls -l'
ls is /bin/ls

or like this:

$ which -a ls
/bin/ls
/usr/bin/ls
/usr/contrib/gnu/bin/ls

Multiple arguments are possible. And since it utilizes the `type'
command, it also handles shell functions, builtins and keywords. If
there are no matches, nothing is printed.

One bug should still be fixed, though: The return code is mostly
meaningless. With bash 1.12.1 it is always 1; with 1.13.1-CWRU it is 0
except when no arguments were given.

-- 
Juergen Nickelsen