redir_script.tests 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. # Builds a " 3>&- 4>&-" string.
  2. # Note: one of these fds is a directory opened to /proc/self/fd
  3. # for globbing. It is unwanted, but I don't know how to filter it out.
  4. find_fds() {
  5. fds=""
  6. for f in /proc/self/fd/*; do
  7. test "$f" = "/proc/self/fd/0" && continue
  8. test "$f" = "/proc/self/fd/1" && continue
  9. test "$f" = "/proc/self/fd/2" && continue
  10. fds="$fds ${f##*/}>&-"
  11. done
  12. }
  13. find_fds
  14. fds1="$fds"
  15. # One of the fds is open to the script body
  16. # Close it while executing something.
  17. eval "find_fds $fds"
  18. # Shell should not lose that fd. Did it?
  19. find_fds
  20. test x"$fds1" = x"$fds" \
  21. && { echo "Ok: script fd is not closed"; exit 0; }
  22. # One legit way to handle it is to move script fd. For example, if we see that fd 10 moved to fd 11:
  23. test x"$fds1" = x" 10>&- 3>&-" && \
  24. test x"$fds" = x" 11>&- 3>&-" \
  25. && { echo "Ok: script fd is not closed"; exit 0; }
  26. # or we see that fd 3 moved to fd 10:
  27. test x"$fds1" = x" 3>&- 4>&-" && \
  28. test x"$fds" = x" 10>&- 3>&-" \
  29. && { echo "Ok: script fd is not closed"; exit 0; }
  30. echo "Bug: script fd is closed"
  31. echo "fds1:$fds1"
  32. echo "fds2:$fds"
  33. exit 1