Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: =?UTF-8?Q?Arne_Vajh=C3=B8j?= Newsgroups: comp.os.vms Subject: Re: Local Versus Global Command Options Date: Sat, 15 Feb 2025 20:21:12 -0500 Organization: A noiseless patient Spider Lines: 99 Message-ID: References: <67afe79c$0$719$14726298@news.sunsite.dk> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Sun, 16 Feb 2025 02:21:13 +0100 (CET) Injection-Info: dont-email.me; posting-host="dc12b2a5336eff3a0e0ee38f65f24bd3"; logging-data="275474"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/KL2MMmkYpz+Qk1XEWas6S94rhHRcOTyM=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:7bJPPSWJY+SUSen8vEFUHaBRsUY= In-Reply-To: Content-Language: en-US Bytes: 3733 On 2/15/2025 4:32 PM, Lawrence D'Oliveiro wrote: > On Sat, 15 Feb 2025 12:22:59 -0700, Mark Berryman wrote: >> So, IMHO, DCL is superior in this regard. > > Unfortunately, no. The fundamental problem with DEC OSes (and this > includes Windows) is that the command line is passed to the program as a > single string buffer. On *nix systems, it is passed as an array of > strings. > > You should be familiar with the well-known problem of one program invoking > another with a command that might include characters with special meanings > to a shell. On a *nix system, there is a simple way to avoid those special > meanings: the first program invokes the second program directly, without > going through a shell. > > Nowadays, there is even a simple library call to do this > . > > This is not so easy to do with a DEC-style command line. How do you get those "characters with special meanings to a shell" interpreted instead of passed on VMS? All my trivial attempts failed: $ type self.pas [inherit('sys$library:pascal$lib_routines', 'sys$library:starlet')] program self(input,output); [external] function decc$system(%immed cmd : c_str_t) : integer; external; type pstr = varying [255] of char; var cmdlin : pstr; begin lib$get_foreign(cmdlin.body, , cmdlin.length); if cmdlin <> '' then begin writeln(cmdlin); end else begin decc$system(malloc_c_str('mcr sys$disk:[]self ''a'' ''b'' ''c''')); lib$spawn('mcr sys$disk:[]self ''a'' ''b'' ''c'''); lib$do_command('mcr sys$disk:[]self ''a'' ''b'' ''c'''); end; end. $ pas self $ link self $ a = 1 $ b = 2 $ c = 3 $ mcr sys$disk:[]self 'a' 'b' 'c' 1 2 3 $ r self 'a' 'b' 'c' 'a' 'b' 'c' 'a' 'b' 'c' $ type self2.c #include #include #include #include int main(int argc, char *argv[]) { $DESCRIPTOR(cmddesc, "mcr sys$disk:[]self2 'a' 'b' 'c'"); if(argc > 1) { for(int i = 1; i < argc; i++) printf(" %s", argv[i]); printf("\n"); } else { system("mcr sys$disk:[]self2 'a' 'b' 'c'"); lib$spawn(&cmddesc); lib$do_command(&cmddesc); } return 0; } $ cc self2 $ link self2 $ a = 1 $ b = 2 $ c = 3 $ mcr sys$disk:[]self 'a' 'b' 'c' 1 2 3 $ r self2 'a' 'b' 'c' 'a' 'b' 'c' 'a' 'b' 'c' Arne