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