Currently dash uses exit status 2 to report failure to run a script named on the command line that does not exist: $ sh nonexistent sh: Can't open nonexistent $ echo $? 2 According to SUSv3 and SUSv4[1], the exit code should be 127. So check errno when opening a command_file during argument processing and exit(127) when it is ENOENT. This check is in the argument processing code to avoid collateral damage to code paths that read scripts (such as the dot builtin). Other errors (such as EACCESS) while opening the command_file will still result in an exit code of 2. [1] http://www.opengroup.org/onlinepubs/9699919799/utilities/sh.html#tag_20_117_14 Reported-by: Clint Adams <schizo@xxxxxxxxxx> Fixes: http://bugs.debian.org/548743 Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx> --- Herbert Xu wrote: > This is wrong. You're creating exactly the problem that Jilles > was talking about where dot(1) is returning 127. This code should > be moved to procargs, which runs only for the "sh script" case. Makes sense. How does this look? It still ignores attempts to run "sh directory"; see the next patch for that. src/options.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) diff --git a/src/options.c b/src/options.c index 6f381e6..5667b68 100644 --- a/src/options.c +++ b/src/options.c @@ -37,6 +37,7 @@ #include <stdlib.h> #include "shell.h" +#include "main.h" #define DEFINE_OPTIONS #include "options.h" #undef DEFINE_OPTIONS @@ -156,7 +157,13 @@ procargs(int argc, char **argv) if (*xargv) goto setarg0; } else if (!sflag) { - setinputfile(*xargv, 0); + if (setinputfile(*xargv, INPUT_NOFILE_OK) < 0) { + if (errno == ENOENT) { + exitstatus = 127; + exerror(EXEXIT, "Can't open %s", *xargv); + } + sh_error("Can't open %s", *xargv); + } setarg0: arg0 = *xargv++; commandname = arg0; -- 1.7.2.3 -- To unsubscribe from this list: send the line "unsubscribe dash" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html