in reply to Re: running programs from PERL
in thread running programs from PERL

Open Question: Windows processes should support %ENV as part of their POSIX support. What is be the corresponding secure Windows-NON-CYGWIN-idiom for the Unix shell's variable interpolation w/o word splitting, i.e. "$f"?

Windows processes do have an environment block, but it is nothing to do with POSIX support. Do not confuse the operating system with the shell - Korn shell 93, for example (via uwin) runs on Windows. It is not that difficult to write a shell which runs on UNIX and Windows (I have done it, so it can't be hard).

The Microsoft cmd.exe shell only uses double-quotes (as does awk) but does not use the $ operator to get a variable value, as is common in some shells, but it uses the % delimiter, as in %PATH%. Coming from a UNIX background I think it is safe to say that cmd.exe does not support interpolation as we know it. By the way, environment variables in Windows are not case-sensitive, so %PATH% is the same as %path% (unlike the c-shell). For example:
C:\>set fred=42 C:\>perl -e "print \"$ENV{FRED}\n\"" 42
Cygwin (and uwin) makes Windows environment variables UPPERCASE, and is case-sensitive.

Replies are listed 'Best First'.
Windows viewpoint?-- Re^3: running programs from PERL
by jakobi (Pilgrim) on Oct 25, 2009 at 14:43 UTC

    With POSIX support I meant the libc and lower portions of POSIX and I was under the impression that e.g POSIX exec() was part of whatever was once enough to give Microsoft some claim of POSIX compatibility certifications for NT and later. Looks like I badly misremembered things.

    My original question is the reverse of your example:

    Can I e.g. set $ENV{VARIABLE} in a non-CYGWIN-port of Perl, and then use system q{dir "%VARIABLE%"} to have cmd.exe expand the variable? More specifically, what happens if the variable contains [\n \\;"']?

    A new question/request:

    What I'd love to do is appending a link to a node giving the comparable portable (or windows) version of $ENV{f}="a b; 'c'"; system q{dir "\$f"}.

    Alternately at most a single concise paragraph as a footnote on the windows side of things to Re: *SAFE* use of string in system command.

    Otherwise its a bit unfair if the Unix view hogs all the good keywords and doesn't help a windows SoPW :)


    What I currently have - after some searching on PerlMonks - is a mess and a headache (and a bit of glee in lacking the windows environment to test this mess).

    It reads like system/exec/(pipe-)open should be avoided on Windows for non-trivial commands, preferring IPC::System::Simple or Win32::Process::Create instead.

    Do we have a better explanation or tutorial already on PerlMonks or do you know of a suitable resource outside?
    Merci!

    cu & thanx, Peter -- hints may be untested unless stated otherwise; use with caution & understanding.