Rename resolved→done (#1-4, #11), closed→done (#13, #18), open (post-core)→open (#7), mark #9 as superseded by #21.
1.5 KiB
1.5 KiB
07 — Implement I/O redirection for commands
Status: open Blocked by: #03
Syntax
`ls -l` > "output.txt" -- redirect stdout to file
`ls -l` >> "output.txt" -- append stdout to file
`cmd` 2> "err.txt" -- redirect stderr to file
`cmd` 2>&1 -- merge stderr into stdout
`cmd` < "input.txt" -- redirect stdin from file
### Alternatively
`ls -l > output.txt` -- redirect stdout to file
`ls -l >> output.txt` -- append stdout to file
`cmd 2> err.txt` -- redirect stderr to file
`cmd 2>&1` -- merge stderr into stdout
`cmd < input.txt` -- redirect stdin from file
Implementation
- Before
execvp()in the child process, usedup2()to redirect file descriptors - Parse redirection operators as part of the command syntax
- Open target files with appropriate flags:
>—O_WRONLY | O_CREAT | O_TRUNC>>—O_WRONLY | O_CREAT | O_APPEND<—O_RDONLY
2>&1—dup2(stdout_fd, STDERR_FILENO)
Challenge
> and >> conflict with Lua's greater-than and right-shift operators. Like piping, these operators must only be valid in command context. The parser can disambiguate because the left-hand side is a command expression.
Alternatives
- Although shell redirection isn’t available, simple redirection can be achieved using the
iolibrary.
file = io.open("OUTFILE.txt", "w")
file:write(`ls /`.stdout)
file:close()