summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS3
-rw-r--r--doc/coreutils.texi6
-rw-r--r--src/nohup.c22
-rwxr-xr-xtests/misc/help-version2
-rwxr-xr-xtests/misc/invalid-opt2
-rwxr-xr-xtests/misc/nohup5
6 files changed, 28 insertions, 12 deletions
diff --git a/NEWS b/NEWS
index f35913309..1ed577f7f 100644
--- a/NEWS
+++ b/NEWS
@@ -29,7 +29,8 @@ GNU coreutils NEWS -*- outline -*-
chroot, env, nice, and su fail with status 125, rather than 1, on
internal error such as failure to parse command line arguments; this
is for consistency with stdbuf and timeout, and avoids ambiguity
- with the invoked command failing with status 1.
+ with the invoked command failing with status 1. Likewise, nohup
+ fails with status 125 instead of 127.
** New features
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
index 31c3d5c1b..c54ffb88f 100644
--- a/doc/coreutils.texi
+++ b/doc/coreutils.texi
@@ -14634,11 +14634,15 @@ options}. Options must precede operands.
Exit status:
@display
+125 if @command{nohup} itself fails, and @env{POSIXLY_CORRECT} is not set
126 if @var{command} is found but cannot be invoked
-127 if @command{nohup} itself fails or if @var{command} cannot be found
+127 if @var{command} cannot be found
the exit status of @var{command} otherwise
@end display
+If @env{POSIXLY_CORRECT} is set, internal failures give status 127
+instead of 125.
+
@node stdbuf invocation
@section @command{stdbuf}: Run a command with modified I/O stream buffering
diff --git a/src/nohup.c b/src/nohup.c
index 99bb86547..880cc7492 100644
--- a/src/nohup.c
+++ b/src/nohup.c
@@ -40,7 +40,7 @@
enum
{
/* `nohup' itself failed. */
- NOHUP_FAILURE = 127
+ POSIX_NOHUP_FAILURE = 127
};
void
@@ -85,6 +85,7 @@ main (int argc, char **argv)
bool redirecting_stdout;
bool stdout_is_closed;
bool redirecting_stderr;
+ int exit_internal_failure;
initialize_main (&argc, &argv);
set_program_name (argv[0]);
@@ -92,18 +93,24 @@ main (int argc, char **argv)
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
- initialize_exit_failure (NOHUP_FAILURE);
+ /* POSIX 2008 requires that internal failure give status 127; unlike
+ for env, exec, nice, time, and xargs where it requires internal
+ failure give something in the range 1-125. For consistency with
+ other tools, fail with EXIT_CANCELED unless POSIXLY_CORRECT. */
+ exit_internal_failure = (getenv ("POSIXLY_CORRECT")
+ ? POSIX_NOHUP_FAILURE : EXIT_CANCELED);
+ initialize_exit_failure (exit_internal_failure);
atexit (close_stdout);
parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE_NAME, Version,
usage, AUTHORS, (char const *) NULL);
if (getopt_long (argc, argv, "+", NULL, NULL) != -1)
- usage (NOHUP_FAILURE);
+ usage (exit_internal_failure);
if (argc <= optind)
{
error (0, 0, _("missing operand"));
- usage (NOHUP_FAILURE);
+ usage (exit_internal_failure);
}
ignoring_input = isatty (STDIN_FILENO);
@@ -154,7 +161,7 @@ main (int argc, char **argv)
if (in_home)
error (0, saved_errno2, _("failed to open %s"),
quote (in_home));
- exit (NOHUP_FAILURE);
+ exit (exit_internal_failure);
}
file = in_home;
}
@@ -179,7 +186,7 @@ main (int argc, char **argv)
if (0 <= saved_stderr_fd
&& set_cloexec_flag (saved_stderr_fd, true) != 0)
- error (NOHUP_FAILURE, errno,
+ error (exit_internal_failure, errno,
_("failed to set the copy of stderr to close on exec"));
if (!redirecting_stdout)
@@ -189,7 +196,8 @@ main (int argc, char **argv)
: N_("redirecting stderr to stdout")));
if (dup2 (out_fd, STDERR_FILENO) < 0)
- error (NOHUP_FAILURE, errno, _("failed to redirect standard error"));
+ error (exit_internal_failure, errno,
+ _("failed to redirect standard error"));
if (stdout_is_closed)
close (out_fd);
diff --git a/tests/misc/help-version b/tests/misc/help-version
index 57cc1e7d3..da559070f 100755
--- a/tests/misc/help-version
+++ b/tests/misc/help-version
@@ -30,7 +30,7 @@ export SHELL
expected_failure_status_chroot=125
expected_failure_status_env=125
expected_failure_status_nice=125
-expected_failure_status_nohup=127
+expected_failure_status_nohup=125
expected_failure_status_stdbuf=125
expected_failure_status_su=125
expected_failure_status_timeout=125
diff --git a/tests/misc/invalid-opt b/tests/misc/invalid-opt
index 155ac6e12..2e5c099da 100755
--- a/tests/misc/invalid-opt
+++ b/tests/misc/invalid-opt
@@ -33,7 +33,7 @@ my %exit_status =
env => 125,
expr => 0,
nice => 125,
- nohup => 127,
+ nohup => 125,
sort => 2,
stdbuf => 125,
su => 125,
diff --git a/tests/misc/nohup b/tests/misc/nohup
index 25a7ca4da..ad04a1cb0 100755
--- a/tests/misc/nohup
+++ b/tests/misc/nohup
@@ -101,8 +101,11 @@ EOF
# Disable these comparisons. Too much variation in 2nd line.
# compare exp err || fail=1
-# Make sure it fails with exit status of 127 when given too few arguments.
+# Make sure it fails with exit status of 125 when given too few arguments,
+# except that POSIX requires 127 in this case.
nohup >/dev/null 2>&1
+test $? = 125 || fail=1
+POSIXLY_CORRECT=1 nohup >/dev/null 2>&1
test $? = 127 || fail=1
Exit $fail