ARG_MAX
| Shells
| whatshell
| portability
| permissions
| UUOC
| ancient
| -
| ../Various
| HOME
"$@"
| echo/printf
| set -e
| test
| tty defs
| tty chars
| $() vs )
| IFS
| using siginfo
| nanosleep
| line charset
| locale
Usually, you won't notice that, because it's not possible to use or redirect file descriptors higher than 9 (single digit) in the shell.
However, if the file descriptor was opened in advance and another process, being started through a Bourne shell script, expects this file descriptor still to be open, then it will fail, because the interposed shell closed it.
This can be demonstrated with a program listing open file descriptors
("list-fd", source),
or with utilities like lsof(8).
$ exec 19>&1 # Redirect file descriptor 19 to where stdout is pointing to.
# Execute this command in a modern bourne compatible shell,
# because the traditional bourne shell doesn't allow it.
$ ./list-fd # Confirm the redirection with a program.
FD 0: O_RDWR
FD 1: O_RDWR
FD 2: O_RDWR
FD 19: O_RDWR
$ cat script.sh # This is a shell script calling that program
#!/bin/sh # ... with the #! mechanism pointing to your Bourne shell
./list-fd
$ ./script.sh # Start it through the #! mechanism: File descriptor 19 was closed by the interpreter,
FD 0: O_RDWR
FD 1: O_RDWR
FD 2: O_RDWR
$ sh ./script.sh # or directly call a traditional bourne shell as interpreter: ...dito,
FD 0: O_RDWR
FD 1: O_RDWR
FD 2: O_RDWR
$ bash ./script.sh # in other shells (bash, ksh, etc.) file descriptor 19 is still open:
FD 0: O_RDWR
FD 1: O_RDWR
FD 2: O_RDWR
FD 19: O_RDWR
A few variants changed this:
It was fixed on SCO Unix 32v42 (and its successors Open Desktop 3 and OpenServer 5).
On HP-UX it was not fixed, but slightly improved: fd 59 is hardcoded instead.