Implement Multiple Redirections (#553)
Add multiple redirections, that is, support for things like: ``` cmd <file1 <file2 ^>> err-log > output | cmd2 ``` In current ion this doesn't work. This change at current would be breaking as the statement: ``` tr 'x' 'y' | tr 'y' 'z' < file > file2 ``` redirects `file` to the first `tr` command. With this change, we would redirect it to the second. ## Overview We treat a multiple redirection as it's own job. The only difference between these jobs and normal jobs is that they only read from their source(s) and then write to their sink(s). ### Parsing Alter `Pipline` contain a vector of `PipeItem`s. A `PipeItem` consists of a `Job`, a `Vec<Redirection>` and a `Vec<Input>`. The above statement would be parsed into two items, `cmd` together with `[file1, file2]` as input and `[err-log, output]` as outputs, and `cmd2` with no `Input`s or `Redirection`s ### Command Generation and Redirection Setup Added two two new variants of `RefinedJob`, `Cat` and `Tee`, `Cat` for concatenating multiple inputs, `Tee` for splitting multiple outputs. Alter the `generate_commands` function to return a `Vec<(RefinedJob, JobKind, Vec<Redirection>, Vec<Input>)>`, then condense `redirect_input` and `redirect_output` into one function that takes ownership and returns a new `Vec<(RefinedJob, JobKind)>`. It is here that we create the `Tee` and `Cat` jobs that we need and put them in the right spot in the pipeline. ### Execution Add `exec_multi_in` and `exec_multi_out` to handle the multiple redirections. These are fairly straightforward, they just read their sources and write to their sinks. I didn't add any extra paths to `exec_job` as the new `RefinedJob` kinds are always part of a pipeline.
Showing
- src/parser/pipelines/collector.rs 299 additions, 207 deletionssrc/parser/pipelines/collector.rs
- src/parser/pipelines/mod.rs 74 additions, 55 deletionssrc/parser/pipelines/mod.rs
- src/parser/statement/parse.rs 8 additions, 7 deletionssrc/parser/statement/parse.rs
- src/shell/job.rs 109 additions, 7 deletionssrc/shell/job.rs
- src/shell/mod.rs 9 additions, 9 deletionssrc/shell/mod.rs
- src/shell/pipe_exec/mod.rs 482 additions, 107 deletionssrc/shell/pipe_exec/mod.rs
Loading
Please register or sign in to comment