Sujet : Re: Local Versus Global Command Options
De : arne (at) *nospam* vajhoej.dk (Arne Vajhøj)
Groupes : comp.os.vmsDate : 16. Feb 2025, 02:21:12
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vorei9$8d0i$1@dont-email.me>
References : 1 2 3 4 5 6 7 8
User-Agent : Mozilla Thunderbird
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
<https://manpages.debian.org/posix_spawn(3)>.
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 <stdio.h>
#include <stdlib.h>
#include <descrip.h>
#include <lib$routines.h>
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