>#! /bin/bash
>umask 022
>export PATH=".:~/bin:/bin:/usr/bin"
>export HOME=`(cd ~; pwd)`
>alias which="$HOME/c/which/which"

>touch cat; chmod 755 cat; pwd
/home/carlo/c/which
>alias

>which
Usage: which [options] [--] COMMAND [...]
Write the full path of COMMAND(s) to standard output.

  --version, -[vV] Print version and exit successfully.
  --help,          Print this help and exit successfully.
  --skip-dot       Skip directories in PATH that start with a dot.
  --skip-tilde     Skip directories in PATH that start with a tilde.
  --show-dot       Don't expand a dot to current directory in output.
  --show-tilde     Output a tilde for HOME directory for non-root.
  --tty-only       Stop processing options on the right if not on tty.
  --all, -a        Print all matches in PATH, not just the first
  --read-alias, -i Read list of aliases from stdin.
  --skip-alias     Ignore option --read-alias; don't read stdin.
  --read-functions Read shell functions from stdin.
  --skip-functions Ignore option --read-functions; don't read stdin.

Recommended use is to write the output of (alias; declare -f) to standard
input, so that which can show aliases and shell functions. See which(1) for
examples.

If the options --read-alias and/or --read-functions are specified then the
output can be a full alias or function definition, optionally followed by
the full path of each command used inside of those.

Report bugs to <which-bugs@gnu.org>.

>which --version
GNU which v2.20, Copyright (C) 1999 - 2008 Carlo Wood.
GNU which comes with ABSOLUTELY NO WARRANTY;
This program is free software; your freedom to use, change
and distribute this program is protected by the GPL.

>which -- --version
which: no --version in (.:~/bin:/bin:/usr/bin)

>which cat
/home/carlo/c/which/cat

>which --show-tilde cat
~/c/which/cat

>which --show-dot cat
./cat

>which --show-tilde --show-dot cat
./cat

>which --skip-dot cat
/bin/cat

>(cd /bin; which cat)
/bin/cat

>(cd /bin; which --show-dot cat)
./cat

>(cd /bin; PATH=".:/bin:/usr/bin" which --show-dot cat)
./cat

>(cd /bin; PATH="/bin:.:/usr/bin" which --show-dot cat)
/bin/cat

>(cd /bin; PATH=".:/bin:/usr/bin" which --skip-dot --show-dot cat)
/bin/cat

>which ls
/bin/ls

>which xxx
which: no xxx in (.:~/bin:/bin:/usr/bin)

>which ./ls
which: no ls in (.)

>(cd /; which bin/ls)
/bin/ls

>(cd /; which --show-dot bin/ls)
./bin/ls

>(cd /; which --show-dot /bin/ls)
/bin/ls

>(cd /; which --show-dot bin/xxx)
which: no xxx in (./bin)

>(cd /; which --show-dot /bin/xxx)
which: no xxx in (/bin)

>which --all cat
/home/carlo/c/which/cat
/bin/cat

>touch xxx
>which ./xxx
which: no xxx in (.)

>chmod 711 xxx
>which ./xxx
/home/carlo/c/which/xxx

>chmod 655 cat
>which cat
/bin/cat

>su
>chown root cat
>exit
>which cat
/home/carlo/c/which/cat

>su
>chmod 545 cat
>exit
>which cat
/bin/cat

>su
>chgrp bin cat
>exit
>which cat
/home/carlo/c/which/cat

>su
>chmod 541 cat
>exit
>which cat
/home/carlo/c/which/cat
>su
>rm -f cat

>chown root xxx
>exit
>which ./xxx
/home/carlo/c/which/xxx

>su
>chmod 700 xxx
>exit
>which ./xxx
which: no xxx in (.)

>id
uid=1000(carlo) gid=1000(carlo) groups=20(dialout),24(cdrom),25(floppy),29(audio),44(video),46(plugdev),106(netdev),109(powerdev),115(kvm),1000(carlo)
>ls -l xxx
-rwx------ 1 root carlo 0 2008-08-06 17:22 xxx
>su
>chmod 750 xxx
>chgrp carlo xxx
>exit
>which ./xxx
/home/carlo/c/which/xxx

>su
>chgrp bin xxx
>exit
>which ./xxx
which: no xxx in (.)

>alias which='alias | which --tty-only --read-alias --show-tilde --show-dot'
>alias test1='test1'
>alias test2='echo "test2" | cat | sort'
>alias test3='  echo "test2"|cat&sort'
>alias test4='	ls &&sort ||/usr/bin/which || exit'

>which which
alias which='alias | which --tty-only --read-alias --show-tilde --show-dot'
	~/c/which/which
>which test1
alias test1='test1'
>which test2
alias test2='echo test2 | cat | sort'
	/bin/echo
	/bin/cat
	/usr/bin/sort
>which test3
alias test3='  echo test2|cat&sort'
	/bin/echo
	/bin/cat
	/usr/bin/sort
>which test4
alias test4='	ls &&sort ||/usr/bin/which || exit'
	/bin/ls
	/usr/bin/sort
	/usr/bin/which
