When I run command, e.g.
test -l --hello check:
shell save the command to variables,
shell execute corresponding binary
the binary read variables
the binary do what the variables say
Is standard streams just these variables?
Questions to @philip-couling (I ask here because limits of comments):
I think you are trying to ask about redirection operators and pipes: <, >, |.
Yup, the standard streams is how redirections and pipe works, right?
break up the line of text into arguments
It saves the arguments/flags and also the command itself. For example, ls is the command part and -la is the argument part. This is important e.g. for busybox that is just one binary and often it called with symlinks (if you run e.g. /bin/ls (that is in path so ls) that is symlink to /bin/busybox, busybox binary need the way to know the command and its flags).
pass as an array to the command
As an array? It doesn't use $0..$∞ variables?
When you open a file to read or wrote the OS gives you a "file descriptor" which is just a number. Child processes inherit file descriptors from their parent. Whatever files were open in the parent will also be open and available to the child (unless the file was opened with an explicit instruction not to).
Each file descriptor is just a number. The first three are used for stdin(0) stdout(1) stderr(2). See STDERR_FILENO in posix. As far as I know these are not technically reserved but the fact these three descriptors usually exist prevents others from using the same number.
A software language might have special syntax to write to stdout (like echo or print) but really all the binary is doing is writing to file descriptor number 0.
Oh, now I remember file descriptors and stdin, stdout, stderr are 0, 1, 2. Really good explanation of these! But thew questions, all output of commands goes to 1 and 2, right? So, when will 1 and 2 be cleared?