I have to work with KSH (yeah that hell shell). I need to use a fork, a subroutine as following:
#!/bin/ksh
PIPE=PIPE_$$
PIPE_ERR=PIPE_ERR_$$
A shell variable is just a piece of memory inside the running shell process. An Environment Variable is a variable that the shell copies into its environment prior to calling another program.
To understand the limitations of Environment Variables, one must understand the concept of the environment of a process: It's a single section of memory that is not shared between processes, but passed on from one process to another during an exec system call. (See also: Environment Variables)
The environment gets passed on from one process to the next, and subsequent processes can change it prior to calling another program.
This environment also has certain restrictions: It can consist only of a list of nul-terminated strings, terminated by a null-pointer. Essentially, it's an array of strings.
Note that these strings do not need to follow the VARNAME=value structure, which is a convention adopted by early unix shells.
ksh93 does support shell co-processes, though.
After starting a child process, the parent can connect to the child's stdin and stdout with the <& p and >& p redirection operators. It can be a challenge to handle these correctly, as many operations close their stdout on termination, which will close the pipe to the child.