The following 'hash -d' statements have different exit statuses. bash --noprofile --norc -c \ 'hash -d ls; echo $?' ## 0 bash --noprofile --norc -c \ 'cat </dev/null; hash -d ls 2>/dev/null; echo $?' ## 1
This depends on a hashable command being given (e.g. cat </dev/null) prior to the 'hash -d'. Bash' documentation says: "The return status is true unless a name is not found ..." So, I'd say, both commands should have exit status 1 - as 'ls' was not hashed. POSIX (https://pubs.opengroup.org/onlinepubs/9699919799/utilities/hash.html) only has -r as option. FWIW: https://github.com/search?q=language%3AShell+content%3A%2F%28%5E%7C%5B%5B%3Ablank%3A%5D%5D%29hash%5B%5B%3Ablank%3A%5D%5D-d%2F+NOT+zsh&type=code Simple patch attached, making 'hash -d ls' exit with 1 in the first case also. But ... Questions 1) Why is 'hash -d x' exiting with 1 at all? If the goal is to `unhash x', 'hash -d x' will do the job. Even if x was not hashed at all. But I am not sure that such a change is feasible (backwards compatible). 2) 'hash x' and 'hash -l x' seem to do the same (i.c. path search and add to hash if found). It would be more useful to let 'hash -l x' give the 'hash -l' output for x. Moreover, I find it unexpected that 'hash -l x' adds x to the hash. A quick look on github, shows no use of 'hash -l x', so changes might be ok. 'hash -lt x' outputs what I would have expected 'hash -l x' to do. Note that 'hash -lt x' doesn't add x to the hash (unexpected). 3) These option combinations should error/exit 1: Ignoring the '-p path' part: hash -p path hash -p path -t name hash -p path -l hash -p path -r This adds name, using path, but ignores the other option: hash -p path -l name hash -p path -d name Using -t ignores -d: hash ls; hash -td ls And -d ignores -l: hash ls; hash -ld ls Conclusion I would say that: - Combining options should error; - Except for an added -r, which first clears; - 'hash -l x' shouldn't add, but print what 'hash -lt x' currently prints; - 'hash -d x' always exits 0, quietly. Let me know if any of this stuff is wanted, I think I can implement this. -- Regards, Mike Jonkmans
hashcmd.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git i/hashcmd.c w/hashcmd.c index ebb92346..62e080be 100644 --- i/hashcmd.c +++ w/hashcmd.c @@ -66,9 +66,12 @@ phash_remove (const char *filename) { register BUCKET_CONTENTS *item; - if (hashing_enabled == 0 || hashed_filenames == 0) + if (hashing_enabled == 0) return 0; + if (hashed_filenames == 0) + return 1; + item = hash_remove (filename, hashed_filenames, 0); if (item) {