- #25: $VAR expansion in commands - #26: Shell abbreviations and user-extensible builtins - #27: $(cmd) subcommand syntax - #22: Updated with implementation details (in progress) - #7: Standardize status label
49 lines
1.5 KiB
Markdown
49 lines
1.5 KiB
Markdown
# 07 — Implement I/O redirection for commands
|
||
|
||
**Status:** open (post-core)
|
||
**Blocked by:** #03
|
||
|
||
## Syntax
|
||
|
||
```lua
|
||
`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
|
||
|
||
```lua lush
|
||
`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, use `dup2()` 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 `io` library.
|
||
|
||
```lua lush
|
||
file = io.open("OUTFILE.txt", "w")
|
||
file:write(`ls /`.stdout)
|
||
file:close()
|
||
```
|