www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - pipeProcess failing

reply DigitalDesigns <DigitalDesigns gmail.com> writes:
I'm calling pipe process using

pipeProcess([AliasSeq!args], Redirect.stdout | Redirect.stdin);

where args is a tuple.


Everything works when I pass each argument individually. If I 
combine any args using a space it fails or if I pass an argument 
with "".

So I guess something like this

pipeProcess(["dmd", "", "-m32 -JC:\"], Redirect.stdout | 
Redirect.stdin);

will fail while

pipeProcess(["dmd", "-m32", "-JC:\"], Redirect.stdout | 
Redirect.stdin);

works.

Is this a bug or something else going on I'm not aware of?

I'm just wrapping pipe process in a function foo(Args...)(Args 
args) and calling it like foo("dmd", "", "-m32 -JC:\").

The reason why it is a problem is that it will simplify some code 
to be able to combine some arguments.
Jun 03 2018
parent Paul Backus <snarwin gmail.com> writes:
On Sunday, 3 June 2018 at 15:07:07 UTC, DigitalDesigns wrote:
 I'm calling pipe process using

 pipeProcess([AliasSeq!args], Redirect.stdout | Redirect.stdin);

 where args is a tuple.


 Everything works when I pass each argument individually. If I 
 combine any args using a space it fails or if I pass an 
 argument with "".

 So I guess something like this

 pipeProcess(["dmd", "", "-m32 -JC:\"], Redirect.stdout | 
 Redirect.stdin);

 will fail while

 pipeProcess(["dmd", "-m32", "-JC:\"], Redirect.stdout | 
 Redirect.stdin);

 works.

 Is this a bug or something else going on I'm not aware of?

 I'm just wrapping pipe process in a function foo(Args...)(Args 
 args) and calling it like foo("dmd", "", "-m32 -JC:\").

 The reason why it is a problem is that it will simplify some 
 code to be able to combine some arguments.
The argument list is just passed along to the child process as its argv. So if the child process is able to handle empty strings or space-combined arguments in argv, then it will work, and if the child process can't do that, it will fail. Normally, the command-line shell takes care of splitting arguments into separate strings, and never passes empty arguments, so most programs are not prepared to handle those cases. If you want the shell to do this work for you, you can try using pipeShell instead of pipeProcess. Otherwise, you will have to do it yourself.
Jun 03 2018