Thorsten Glaser schreef op 26-02-16 om 21:57: > In the end, I decided I don’t like the code and rewrote it entirely, > separating options processing, simplifying, etc. but thanks anyway!
Yes, that code looks much cleaner. No more opaque mixing of two different command's option logic. I also missed something in that patch -- aliases still weren't handled correctly. But your new code fixes that too. I also submitted a patch to OpenBSD ksh for this and in the process I wrote a couple of more robust regression tests, one to make sure 'command' behaves correctly and the other to check 'whence' behaviour hasn't changed. Here they are as a patch against mksh, latest cvs. (They pass.) - M. cvs diff: Diffing . Index: check.t =================================================================== RCS file: /cvs/src/bin/mksh/check.t,v retrieving revision 1.726 diff -u -r1.726 check.t --- check.t 1 Mar 2016 18:30:25 -0000 1.726 +++ check.t 5 Mar 2016 03:47:29 -0000 @@ -12196,13 +12196,75 @@ after 0='swc' 1='二' 2='' = done --- -name: command-path +name: command-pvV-posix-priorities description: - Check 'command -p' is not 'whence -p' -stdin: - command -pv if + For POSIX compatibility, command -v should find aliases and reserved + words, and command -p[vV] should find aliases, reserved words, and + builtins over external commands. +stdin: + PATH=/bin:/usr/bin + alias foo="bar baz" + bar() { :; } + for word in 'if' 'foo' 'bar' 'set' 'true'; do + command -v "$word" + command -pv "$word" + command -V "$word" + command -pV "$word" + done +expected-stdout: + if + if + if is a reserved word + if is a reserved word + alias foo='bar baz' + alias foo='bar baz' + foo is an alias for 'bar baz' + foo is an alias for 'bar baz' + bar + bar + bar is a function + bar is a function + set + set + set is a special shell builtin + set is a special shell builtin + true + true + true is a shell builtin + true is a shell builtin +--- +name: whence-preserve-tradition +description: + This regression test is to ensure that the POSIX compatibility + changes for 'command' (see previous test) do not affect traditional + 'whence' behaviour. +stdin: + PATH=/bin:/usr/bin + alias foo="bar baz" + bar() { :; } + for word in 'if' 'foo' 'bar' 'set' 'true'; do + whence "$word" + whence -p "$word" + whence -v "$word" + whence -pv "$word" + done expected-stdout: if + if is a reserved word + if not found + 'bar baz' + foo is an alias for 'bar baz' + foo not found + bar + bar is a function + bar not found + set + set is a special shell builtin + set not found + true + /usr/bin/true + true is a shell builtin + true is a tracked alias for /usr/bin/true --- name: duffs-device description: