tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: sh(1): POSIX "Command Search and Execution"



On Sun, 22 Sep 2024, Robert Elz wrote:

ps: Of course, one can almost accomplish this with functions...

PATH_TO_BASIC_UTILITIES=/usr/bin/-
PATH_TO_ENHANCED_UTILITIES=/usr/bin/+
-() { ${PATH_TO_BASIC_UTILITIES}/"$@" ; }
+() { ${PATH_TO_ENHANCED_UTILITIES}/"$@" ; }

and then use them as
	- cat ...
	+ ls
instead of
	-/cat ...
	+/ls

and in that the "cat" part *is* allowed to have '/' in its name.


If your shell is bash, and it allows `/' in function names, you can do this:

```
$ cat mk-funcs.sh
OIFS=$IFS
IFS=:
set -- $PATH
N=$#
IFS=$OIFS

# walk backwards through dirs to match PATH-search order.
#
while [ $N -gt 0 ]
do
	(
	eval d=\${$N}
	cd "$d"
	for f in */*
	do	test -x "$f" || continue
		printf '%s () {\n\tcommand "%s" "$@"\n}\n' "$f" "$d/$f"
	done
	)
	N=$((N - 1))
done

$ mkdir /tmp/ip

$ cp /bin/echo /tmp/ip/.

$ cp /usr/bin/printf /tmp/ip/.

$ eval "$(PATH=$PATH:/tmp . ./mk-funcs.sh)"

$ ip/echo hello
hello

$ ip/printf '%s\n' world
world
```

Of course, if you add/delete/rename commands (or dirs. in PATH), you'll have
to recreate the functions again (`hash -r` equiv.).

-RVP


Home | Main Index | Thread Index | Old Index