diff options
author | jilles <jilles@FreeBSD.org> | 2012-02-11 21:06:45 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2012-02-11 21:06:45 +0000 |
commit | 0458d57ea3cd173f7a4e71d67ee628f844dbdd70 (patch) | |
tree | 852790d9d43354df7d798f44b33557a07ff9b181 | |
parent | 959ca16023aae7c8432edca09966fbccd16d5a90 (diff) | |
download | FreeBSD-src-0458d57ea3cd173f7a4e71d67ee628f844dbdd70.zip FreeBSD-src-0458d57ea3cd173f7a4e71d67ee628f844dbdd70.tar.gz |
sh: Make 'hash' return 1 if at least one utility is not found.
Reported by: lme
-rw-r--r-- | bin/sh/exec.c | 20 | ||||
-rw-r--r-- | tools/regression/bin/sh/builtins/hash4.0 | 6 |
2 files changed, 18 insertions, 8 deletions
diff --git a/bin/sh/exec.c b/bin/sh/exec.c index 82cb3ac..f2e4c1d 100644 --- a/bin/sh/exec.c +++ b/bin/sh/exec.c @@ -231,7 +231,9 @@ hashcmd(int argc __unused, char **argv __unused) int verbose; struct cmdentry entry; char *name; + int errors; + errors = 0; verbose = 0; while ((c = nextopt("rv")) != '\0') { if (c == 'r') { @@ -254,19 +256,21 @@ hashcmd(int argc __unused, char **argv __unused) && cmdp->cmdtype == CMDNORMAL) delete_cmd_entry(); find_command(name, &entry, DO_ERR, pathval()); - if (verbose) { - if (entry.cmdtype != CMDUNKNOWN) { /* if no error msg */ - cmdp = cmdlookup(name, 0); - if (cmdp != NULL) - printentry(cmdp, verbose); - else - outfmt(out2, "%s: not found\n", name); + if (entry.cmdtype == CMDUNKNOWN) + errors = 1; + else if (verbose) { + cmdp = cmdlookup(name, 0); + if (cmdp != NULL) + printentry(cmdp, verbose); + else { + outfmt(out2, "%s: not found\n", name); + errors = 1; } flushall(); } argptr++; } - return 0; + return errors; } diff --git a/tools/regression/bin/sh/builtins/hash4.0 b/tools/regression/bin/sh/builtins/hash4.0 new file mode 100644 index 0000000..dec584c --- /dev/null +++ b/tools/regression/bin/sh/builtins/hash4.0 @@ -0,0 +1,6 @@ +# $FreeBSD$ + +exec 3>&1 +m=`hash nosuchtool 2>&1 >&3` +r=$? +[ "$r" != 0 ] && [ -n "$m" ] |