This is the mail archive of the cygwin@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Perl system() and Cygwin


On Tue, 15 Oct 2002, Scott Prive wrote:

> Hello,
>
> I'm experiencing some non-intuitive behavior when -- under Cygwin Perl
> -- calling system commands. The FAQ alludes to "differences" between
> Cygwin and systems like Linux.. this might be another one of these
> differences, or it might be dumb-user-error.
>
> I have a solution I can live with. I just don't like not knowing what
> breaks my other attempts.
>
> I want to do the Perl equivalent of
> net use Q: \\\\e04-3000\\foo foo /user:foo
>
> This always works in bash, running 'net' and everything else is an
> argument. This works under Cygwin /bin/bash just fine.
>
> In Perl, you can call commands like so:
>         system("net use Q: \\\\e04-3000\\foo foo /user:foo");
> This fails, with the net command returning Error 67 (resource not
> found). Unfortunately there's no way it tells me what it THINKS it saw.
>
> This also fails:
> system("net", "use Q: \\\\e04-3000\\foo foo /user:foo");
>
> *** This WORKS:
> system("net", "use", "Q:", "\\\\e04-3000\\foo", "foo", "/user:foo");
> But it's *evil*.
>
> Since the above works, I try less evil-looking code:
> $cmd = "net use Q: \\\\e04-3000\\foo foo /user:foo"
> $mountcode = system (split(' ',$cmd));
> to simulate the list that worked. This also fails.
>
>
> I've been executing code like this (all one string) all along under
> Linux & Perl. I'm assuming Perl's system() on Cygwin executes CMD.EXE as
> a subshell (this true?) and, well, this is "one of those differences"
>
> Any Thoughts? Thanks.
> -Scott

Scott,
Any perl will behave like this, even the Linux one.  Your problem is the
backslashes.  Since you provide the command all in one chunk, a shell is
invoked to parse the arguments, and it obviously sees fewer backslashes
than you provided (because some are used as escapes in perl itself).  So,
if you want to use the single-parameter system() call, you have to escape
each backslash twice (i.e., double the number of backslashes).
I don't really know why the split doesn't work, except to guess that it
might be interpreting the result in a scalar context...  Try assigning it
to a list first.
	Igor
-- 
				http://cs.nyu.edu/~pechtcha/
      |\      _,,,---,,_		pechtcha@cs.nyu.edu
ZZZzz /,`.-'`'    -.  ;-;;,_		igor@watson.ibm.com
     |,4-  ) )-,_. ,\ (  `'-'		Igor Pechtchanski
    '---''(_/--'  `-'\_) fL	a.k.a JaguaR-R-R-r-r-r-.-.-.  Meow!

"Water molecules expand as they grow warmer" (C) Popular Science, Oct'02, p.51


--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]