Could I ask some questions on the pipeline, the following code always stops at the second cmds, cmds[1]. I tested the command under shell and found it can quickly end and get output.bam

```
import std.process;
import std.stdio;
import std.conv;
void executeCommandPipe(string[][] cmds) {

    // pipe init
    auto temp_pipe = pipe(); // save cmd1, cmd2, cmd3 ...

    // process first
auto pid_first = spawnProcess(cmds[0], stdin, temp_pipe.writeEnd);
    scope(exit) wait(pid_first);

    // process cmd2 ~ cmdN-1
    for (int i = 1; i < cmds.length - 1; i++) {
        auto new_pipe = pipe(); // create next pipe

auto pid = spawnProcess(cmds[i], temp_pipe.readEnd, new_pipe.writeEnd);
        scope(exit) wait(pid);

        temp_pipe = new_pipe; // update the pipe
    }

    // process final, output to stdout
auto pid_final = spawnProcess(cmds[$-1], temp_pipe.readEnd, stdout);
    scope(exit) wait(pid_final);
}
void main() {
string[][]cmds=[["samtools", "fixmate", "-@", "8", "-m", "-u", "input.bam", "-"], ["samtools", "sort", "-@", "8", "-u", "-",], ["samtools", "markdup", "-@", "8", "-u", "-", "output.bam"]];
    executeCommandPipe(cmds);
}

```
corresponding Linux command is
```
samtools fixmate -@ 8 -m -u input.bam - | samtools sort -@ 8 -u - | samtools markdup -u - output.bam
```

  • Pipeline issue zzzSleep via Digitalmars-d-learn

Reply via email to