Bourne | Ash | #! | find | ARG_MAX | Shells | whatshell | portability | permissions | UUOC | ancient | - | ../Various | HOME
"$@" | echo/printf | set -e | test | tty defs | tty chars | $() vs ) | IFS | using siginfo | nanosleep | line charset | locale


Internal limit related to hash


Bourne shells with the hash built-in have a subtle internal limit.

It becomes apparent, if the environment variable PATH contains more than 255 elements.
Commands are not found by path search anymore, if they are at the right of the 255th element.
You might get an error message like "unknown builtin" or "command not found",
or an arbitrary built-in may even be called, like export (then printing the environment variables).

That's the only resource-like limit of the Bourne shell I am aware of, and it's of rather theoretical nature.
I believe Steve Bourne took care to avoid any such limits.

The symptoms are related to the hash built-in:

Here is an example,

	 PATH=/bin export PATH
	 i=1; while [ "$i" -lt 255 ]; do
		 PATH=/:$PATH
		 i=`/usr/bin/expr $i + 1`
	 done
	 echo hashing ok:
	 echo $PATH|tr : ' '|wc -w # how many elements?
	 hash -r; printf 'found printf\n' # search printf(1)
	 PATH=/:$PATH # add one element to exceed limit
	 echo hashing fails:
	 echo $PATH|tr : ' '|wc -w
	 hash -r; printf 'found printf\n' # and search printf(1) again
which produces this output:
	 hashing ok:
		 255
	 found printf
	 hashing fails:
		 256
	 unknown builtin

I don't know the very nature, yet, but I believe the error message results from a corrupted data structure
(concerning PATH search) somewhere near hash.c: hfind()


AltStyle によって変換されたページ (->オリジナル) /