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: RESOLVED: Perl system() and Cygwin



> -----Original Message-----
> From: Igor Pechtchanski [mailto:pechtcha@cs.nyu.edu]
> Sent: Tuesday, October 15, 2002 4:00 PM
> To: Scott Prive
> Cc: cygwin@cygwin.com
> Subject: 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

You're right. Wrote a small shell script that echo'd out $* $@ so I could verify the translation loss. I was thinking "this worked in Linux" because I often put commands in a string, which provide some protection... but I never send \\\\ to the shell so double-escaping seemed like a non-issue.


So, I have a double-escaped UNC ("ugg-lee!" :-) to mount CIFS.
  DB<36> system("net use Q: \\\\\\\\e04-3000\\\\foo foo /user:foo");
The command completed successfully.


Thanks,

Scott


--
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]