| # This program is free software: you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation, either version 3 of the License, or |
| # (at your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| # |
| : ${TMPDIR:=/tmp} |
| |
| export LC_ALL=C |
| export LANG=C |
| |
| # catch-all for remaining untested redirection stuff |
| set +o posix |
| |
| echo abc > /tmp/redir-test |
| cat /tmp/redir-test |
| |
| set -o noclobber |
| |
| #this should be an error |
| echo def > /tmp/redir-test |
| cat /tmp/redir-test |
| |
| # but this should succeed |
| echo def > /tmp/redir-test-2 |
| cat /tmp/redir-test-2 |
| |
| # and so should this |
| echo def >| /tmp/redir-test |
| cat /tmp/redir-test |
| |
| set +o noclobber |
| rm /tmp/redir-test /tmp/redir-test-2 |
| |
| # this should be an error |
| z="a b" |
| cat < $z |
| |
| echo "Point 1" |
| |
| exec 3</etc/passwd |
| exec 4>$TMPDIR/bash-a |
| exec 5>$TMPDIR/bash-b |
| echo "Point 2" |
| |
| echo to a 1>&4 |
| echo to b 1>&5 |
| cat $TMPDIR/bash-a |
| cat $TMPDIR/bash-b |
| exec 11</dev/null |
| echo "Point 3" |
| |
| echo to a 1>&4 |
| echo to b 1>&5 |
| cat $TMPDIR/bash-a |
| cat $TMPDIR/bash-b |
| |
| exec 11<&- |
| echo "Point 4" |
| |
| exec 6<>$TMPDIR/bash-c |
| echo to c 1>&6 |
| cat $TMPDIR/bash-c |
| echo "Point 5" |
| |
| # clean up before running scripts |
| exec 4>&- 5>&- 6<&- |
| |
| rm -f $TMPDIR/bash-a $TMPDIR/bash-b $TMPDIR/bash-c |
| |
| # |
| # Test the effect of input buffering on the shell's input |
| # |
| ${THIS_SH} < redir1.sub |
| |
| # more open, close, duplicate file descriptors |
| ${THIS_SH} ./redir3.sub < ./redir3.in1 |
| |
| # still more redirections |
| ${THIS_SH} ./redir4.sub < redir4.in1 |
| |
| # various forms of null redirection |
| testf() |
| { |
| if [ -f "$1" ]; then |
| rm -f "$1" |
| else |
| echo oops -- $1 not found |
| fi |
| } |
| |
| > $TMPDIR/null-redir-a |
| testf $TMPDIR/null-redir-a |
| |
| $EXIT > $TMPDIR/null-redir-b |
| testf $TMPDIR/null-redir-b |
| |
| ( > $TMPDIR/null-redir-c ) |
| testf $TMPDIR/null-redir-c |
| |
| $EXIT > $TMPDIR/null-redir-d & |
| wait |
| testf $TMPDIR/null-redir-d |
| |
| exit 3 | $EXIT > $TMPDIR/null-redir-e |
| echo $? -- ${PIPESTATUS[@]} |
| testf $TMPDIR/null-redir-e |
| |
| exit 4 | > $TMPDIR/null-redir-f |
| echo $? -- ${PIPESTATUS[@]} |
| testf $TMPDIR/null-redir-f |
| |
| > $TMPDIR/null-redir-g & |
| wait |
| testf $TMPDIR/null-redir-g |
| |
| exec >$TMPDIR/null-redir-h & |
| wait |
| testf $TMPDIR/null-redir-h |
| |
| # make sure async commands don't get /dev/null as stdin when an explicit |
| # input redirection is supplied |
| for x in 1 2 3; do |
| { read line ; echo $line ; } & |
| wait |
| { read line ; echo $line ; } & |
| wait |
| done << EOF |
| ab |
| cd |
| ef |
| gh |
| ij |
| kl |
| EOF |
| |
| # make sure async commands get /dev/null as stdin in the absence of any |
| # input redirection |
| /bin/cat & |
| wait |
| echo $? |
| |
| # make sure that loops work OK with here documents and are not run in |
| # subshells |
| while read line; do |
| echo $line |
| l2=$line |
| done << EOF |
| ab |
| cd |
| EOF |
| echo $l2 |
| |
| # These should not echo anything -- bug in versions before 2.04 |
| ( ( echo hello 1>&3 ) 3>&1 ) >/dev/null 2>&1 |
| |
| ( ( echo hello 1>&3 ) 3>&1 ) >/dev/null 2>&1 | cat |
| |
| # in posix mode, non-interactive shells are not allowed to perform |
| # filename expansion on input redirections, even if they expand to |
| # a single filename |
| set -o posix |
| cat < redir1.* |
| |
| # test ksh93 dup-and-close (move fd) redirections |
| ${THIS_SH} ./redir5.sub |
| |
| # test behavior after a write error with a builtin command |
| ${THIS_SH} ./redir6.sub |
| |
| # problem with redirections using fds bash uses internally |
| : ${TMPDIR:=$TMPDIR} |
| |
| trap 'rm -f $TMPDIR/bash-redir-$$' 0 1 2 3 6 15 |
| |
| echo before block |
| { |
| echo before redir |
| exec 10>&1 |
| echo after redir |
| } > $TMPDIR/bash-redir-$$ |
| |
| echo after block |
| |
| ${THIS_SH} ./redir7.sub |
| |
| ${THIS_SH} ./redir8.sub |
| |
| exec 9>&2 |
| command exec 2>$TMPDIR/foo-$$ |
| echo whatsis >&2 |
| echo cat /tmp/foo |
| cat $TMPDIR/foo-$$ |
| rm -f $TMPDIR/foo-$$ |
| exec 2>&9 |
| exec 9>&- |
| |
| ${THIS_SH} ./redir9.sub |
| |
| ${THIS_SH} ./redir10.sub |
| |
| ${THIS_SH} ./redir11.sub |