1#!/bin/sh
2# test nohup
3
4# Copyright (C) 2003-2023 Free Software Foundation, Inc.
5
6# This program is free software: you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation, either version 3 of the License, or
9# (at your option) any later version.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14# GNU General Public License for more details.
15
16# You should have received a copy of the GNU General Public License
17# along with this program.  If not, see <https://www.gnu.org/licenses/>.
18
19. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
20print_ver_ nohup
21
22
23nohup sh -c 'echo stdout; echo stderr 1>&2' 2>err || fail=1
24
25# Be careful.  The results of the above nohup command
26# change depending on whether stdin and stdout are redirected.
27if test -t 1; then
28  test "$(cat nohup.out)" = stdout || fail=1
29  if test -t 0; then
30    echo 'nohup: ignoring input and appending output to 'nohup.out'\'
31  else
32    echo 'nohup: appending output to 'nohup.out'\'
33  fi >exp || framework_failure_
34else
35  # Here it should not even exist.
36  test -f nohup.out && fail=1
37  if test -t 0; then
38    echo 'nohup: ignoring input' >exp
39  else
40    rm -f exp
41  fi || framework_failure_
42fi
43echo 'stderr' >> exp || framework_failure_
44
45compare exp err || fail=1
46rm -f nohup.out err exp
47# ----------------------
48
49# Be careful.  The results of the following nohup command
50# change depending on whether stderr is redirected.
51nohup sh -c 'echo stdout; echo stderr 1>&2' >out || fail=1
52if test -t 2; then
53  test "$(cat out|tr '\n' -)" = stdout-stderr- || fail=1
54else
55  test "$(cat out|tr '\n' -)" = stdout- || fail=1
56fi
57# It must *not* exist.
58test -f nohup.out && fail=1
59rm -f nohup.out err
60# ----------------------
61
62# Bug present through coreutils 8.0: failure to print advisory message
63# to stderr must be fatal.  Requires stdout to be terminal.
64if test -w /dev/full && test -c /dev/full; then
65(
66  # POSIX shells immediately exit the subshell on exec error.
67  # So check we can write to /dev/tty before the exec, which
68  # isn't possible if we've no controlling tty for example.
69  test -c /dev/tty && >/dev/tty || exit 0
70
71  exec >/dev/tty
72  test -t 1 || exit 0
73  returns_ 125 nohup echo hi 2> /dev/full || fail=1
74  test -f nohup.out || fail=1
75  compare /dev/null nohup.out || fail=1
76  rm -f nohup.out
77  exit $fail
78) || fail=1
79fi
80
81nohup no-such-command 2> err
82errno=$?
83if test -t 1; then
84  test $errno = 127 || fail=1
85  # It must exist.
86  test -f nohup.out || fail=1
87  # It must be empty.
88  compare /dev/null nohup.out || fail=1
89fi
90
91cat <<\EOF > exp || framework_failure_
92nohup: appending output to 'nohup.out'
93nohup: cannot run command 'no-such-command': No such file or directory
94EOF
95# Disable these comparisons.  Too much variation in 2nd line.
96# compare exp err || fail=1
97rm -f nohup.out err exp
98# ----------------------
99
100touch k; chmod 0 k
101nohup ./k 2> err
102errno=$?
103test $errno = 126 || fail=1
104if test -t 1; then
105  # It must exist.
106  test -f nohup.out || fail=1
107  # It must be empty.
108  compare /dev/null nohup.out || fail=1
109fi
110
111cat <<\EOF > exp || framework_failure_
112nohup: appending output to 'nohup.out'
113nohup: cannot run command './k': Permission denied
114EOF
115# Disable these comparisons.  Too much variation in 2nd line.
116# compare exp err || fail=1
117
118# Make sure it fails with exit status of 125 when given too few arguments,
119# except that POSIX requires 127 in this case.
120returns_ 125 nohup >/dev/null 2>&1 || fail=1
121export POSIXLY_CORRECT=1
122returns_ 127 nohup >/dev/null 2>&1 || fail=1
123unset POSIXLY_CORRECT
124
125Exit $fail
126