>#! /bin/bash
>umask 022
>export PATH=".:~/bin:/bin:/usr/bin"
>alias /home/carlo/projects/savannah.which/which/build/which="$BUILDDIR/which"

>touch cat; chmod 755 cat; pwd
/home/carlo/projects/savannah.which/which/build
>alias

>/home/carlo/projects/savannah.which/which/build/which
Usage: /home/carlo/projects/savannah.which/which/build/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>.

>/home/carlo/projects/savannah.which/which/build/which --version
GNU which v2.23, Copyright (C) 1999 - 2025 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.

>/home/carlo/projects/savannah.which/which/build/which -- --version
/home/carlo/projects/savannah.which/which/build/which: no --version in (.:~/bin:/bin:/usr/bin)

>/home/carlo/projects/savannah.which/which/build/which cat
/home/carlo/projects/savannah.which/which/build/cat

>/home/carlo/projects/savannah.which/which/build/which --show-tilde cat
~/projects/savannah.which/which/build/cat

>/home/carlo/projects/savannah.which/which/build/which --show-dot cat
./cat

>/home/carlo/projects/savannah.which/which/build/which --show-tilde --show-dot cat
./cat

>/home/carlo/projects/savannah.which/which/build/which --skip-dot cat
/bin/cat

>(cd /bin; /home/carlo/projects/savannah.which/which/build/which cat)
/usr/bin/cat

>(cd /bin; /home/carlo/projects/savannah.which/which/build/which --show-dot cat)
./cat

>(cd /bin; PATH=".:/bin:/usr/bin" /home/carlo/projects/savannah.which/which/build/which --show-dot cat)
./cat

>(cd /bin; PATH="/bin:.:/usr/bin" /home/carlo/projects/savannah.which/which/build/which --show-dot cat)
/bin/cat

>(cd /bin; PATH=".:/bin:/usr/bin" /home/carlo/projects/savannah.which/which/build/which --skip-dot --show-dot cat)
/bin/cat

>/home/carlo/projects/savannah.which/which/build/which ls
/bin/ls

>/home/carlo/projects/savannah.which/which/build/which xxx
/home/carlo/projects/savannah.which/which/build/which: no xxx in (.:~/bin:/bin:/usr/bin)

>/home/carlo/projects/savannah.which/which/build/which ./ls
/home/carlo/projects/savannah.which/which/build/which: no ls in (.)

>(cd /; /home/carlo/projects/savannah.which/which/build/which bin/ls)
/bin/ls

>(cd /; /home/carlo/projects/savannah.which/which/build/which --show-dot bin/ls)
./bin/ls

>(cd /; /home/carlo/projects/savannah.which/which/build/which --show-dot /bin/ls)
/bin/ls

>(cd /; /home/carlo/projects/savannah.which/which/build/which --show-dot bin/xxx)
/home/carlo/projects/savannah.which/which/build/which: no xxx in (./bin)

>(cd /; /home/carlo/projects/savannah.which/which/build/which --show-dot /bin/xxx)
/home/carlo/projects/savannah.which/which/build/which: no xxx in (/bin)

>/home/carlo/projects/savannah.which/which/build/which --all cat
/home/carlo/projects/savannah.which/which/build/cat
/bin/cat
/usr/bin/cat

>touch xxx
>/home/carlo/projects/savannah.which/which/build/which ./xxx
/home/carlo/projects/savannah.which/which/build/which: no xxx in (.)

>chmod 711 xxx
>/home/carlo/projects/savannah.which/which/build/which ./xxx
/home/carlo/projects/savannah.which/which/build/xxx

>chmod 655 cat
>/home/carlo/projects/savannah.which/which/build/which cat
/bin/cat

>su
>chown root cat
>exit
>/home/carlo/projects/savannah.which/which/build/which cat
/home/carlo/projects/savannah.which/which/build/cat

>su
>chmod 545 cat
>exit
>/home/carlo/projects/savannah.which/which/build/which cat
/bin/cat

>su
>chgrp bin cat
>exit
>/home/carlo/projects/savannah.which/which/build/which cat
/home/carlo/projects/savannah.which/which/build/cat

>su
>chmod 541 cat
>exit
>/home/carlo/projects/savannah.which/which/build/which cat
/home/carlo/projects/savannah.which/which/build/cat
>su
>rm -f cat

>chown root xxx
>exit
>/home/carlo/projects/savannah.which/which/build/which ./xxx
/home/carlo/projects/savannah.which/which/build/xxx

>su
>chmod 700 xxx
>exit
>/home/carlo/projects/savannah.which/which/build/which ./xxx
/home/carlo/projects/savannah.which/which/build/which: no xxx in (.)

>id
uid=1000(carlo) gid=1000(carlo) groups=1000(carlo),0(root),150(wireshark),960(docker),972(deluge),973(realtime),995(audio),998(wheel)
>ls -l xxx
-rwx------ 1 root carlo 0 Feb  1 19:56 xxx
>su
>chmod 750 xxx
>chgrp carlo xxx
>exit
>/home/carlo/projects/savannah.which/which/build/which ./xxx
/home/carlo/projects/savannah.which/which/build/xxx

>su
>chgrp bin xxx
>exit
>/home/carlo/projects/savannah.which/which/build/which ./xxx
/home/carlo/projects/savannah.which/which/build/which: no xxx in (.)

>mkdir -p {a,b}
>touch b/test
>chmod 755 b/test
>(cd a; /home/carlo/projects/savannah.which/which/build/which ../b/test)
/home/carlo/projects/savannah.which/which/build/b/test

>alias which='alias | /home/carlo/projects/savannah.which/which/build/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 | /home/carlo/projects/savannah.which/which/build/which --tty-only --read-alias --show-tilde --show-dot'
	~/projects/savannah.which/which/build/which
>which test1
alias test1='test1'
>which test2
alias test2='echo test2 | cat | sort'
	/bin/echo
	/bin/cat
	/bin/sort
>which test3
alias test3='  echo test2|cat&sort'
	/bin/echo
	/bin/cat
	/bin/sort
>which test4
alias test4='	ls &&sort ||/usr/bin/which || exit'
	/bin/ls
	/bin/sort
	/usr/bin/which
