On Saturday, 18 November 2023 at 18:09:53 UTC, BoQsc wrote:
Latest iteration on this thread.
Limitations:
* pipes through two programs.
* very verbose, hard to use.
What exactly are you trying to achieve?
```
import std;
import std.process;
version (Windows) { enum Find = "find"; }
version (Posix) { enum Find = "grep"; }
void pipeTo(Pipe p, string nextprogram){
spawnShell(nextprogram, p.readEnd, stdout);
```
If you allow invoking the shell from within your program why
don't you use one of its facilities, i.e. the shell's pipe
operator `|`, in the first place? `spawnShell` does not execute
`nextprogram` but it executes it under the shell.
```
}
auto program(string name){
Pipe p = std.process.pipe;
spawnShell(name, stdin, p.writeEnd);
return p;
}
void main()
{
program("echo HelloWorld").pipeTo(nextprogram: Find ~ `
"HelloWorld"`);
Have I missed the advent of named function arguments in D?
```
}
```
Your whole program shrinks considerably:
```
import std;
import std.process;
version (Windows) { enum Find = "find"; }
version (Posix) { enum Find = "grep"; }
void main()
{
spawnShell("echo HelloWorld | " ~ Find ~ `
"HelloWorld"`).wait;
}
```