English Amiga Board


Go Back   English Amiga Board > Coders > Coders. Language

 
 
Thread Tools
Old 01 December 2022, 02:02   #1
tygre
Returning fan!
 
tygre's Avatar
 
Join Date: Jan 2011
Location: Montréal, QC, Canada
Posts: 1,434
ARexx RC is 0 Even When Command Fails

Hi there!

I'm developing some ARexx scripts to test systematically players but I run into a problem with the following code:

Code:
IF ~SHOW('P', 'AMIGAAMP') THEN DO
   ADDRESS Command 'Run AmigaAMP'
   SAY 'Result1: ' || RC
   SAY 'Result2: ' || Result
   ...
If AmigaAMP (in this example) is not in the path, then the Run command will fail and print out:

Code:
AmigaAMP: Unknown command
AmigaAMP failed returncode 10
But, RC = 0

(I tried redirecting the output of Run to a file using Run >T:Output but it contains only the CLI name, not the two error lines, which are still printed out in the Shell...)

What am I missing?
Tygre
tygre is offline  
Old 01 December 2022, 07:15   #2
Thomas Richter
Registered User
 
Join Date: Jan 2019
Location: Germany
Posts: 3,233
The problem is most likely the shell and not Arexx. What the "Run" command does is that it takes the rest of the command line without even looking, then spawns a new shell, and leave it to the new shell to work on this command line. Since "Run" is asynchronous, there is no way by the spawned shell to communicate any results back to the shell that launched it. The RC=0 result in this case only tells you "Yup, I could create a new shell for you succesfully".

You find more information on this in the autodocs of the System() call - this is how Run works (or at least, as of 3.2 it does.)
Thomas Richter is offline  
Old 01 December 2022, 14:28   #3
daxb
Registered User
 
Join Date: Oct 2009
Location: Germany
Posts: 3,304
Check out the example WaitForPort (a command usually placed in Rexxc) in ARexxGuide: http://aminet.net/search?query=arexxguide2

Further I would first check the path of your command AmigaAMP with "IF EXISTS(<filespec>)" where <filespec> is the full path to AmigaAMP and if not exist exit the script with error message. More or less on top of your script.

Code:
   /**/
      /* @{" SHOW() " link ARx_Func2.ag/SHOW()} can be used to check for the existence of a port    */
   if ~show('P', 'VLT') then do
      address command    /* both RUN and WAITFORPORT are DOS commands.*/
      'run >nil: vlt:VLT'
         /*
            The loop below assures that the program will wait at least 50
            seconds for the port to open, but will exit as soon as the port
            is available.
         */
      do 5 while ~show('P', 'VLT')
         'waitforport VLT'
      end
      address           /* @{" toggle " link ARx_Instr.ag/ADDRESS 23} back to previous address           */
         /* The return code RC is set to 5 when WaitForPort times out  **
         ** before the port is available.                              */
      if rc = 5 then do
         say 'Unable to load VLT'
         exit
      end
   end
daxb is offline  
Old 01 December 2022, 22:42   #4
tygre
Returning fan!
 
tygre's Avatar
 
Join Date: Jan 2011
Location: Montréal, QC, Canada
Posts: 1,434
Hi Thomas and Daxb!

Thanks for your answers!

Yes, you're right of course, Thomas, it's the Run command creating a new shell... I wonder if there is a way to redirect the output of this new shell somewhere where I could look at it? I tried with >T:Output after Run and after AmigaAMP but still its output (like AmigaAMP: Unknown command) appears in the current Shell window.

I don't mind using a special command: I'm using Run only because AmigaAMP doesn't detach itself from the current Shell.

That's a good idea, Daxb, the do 5 while ~show('P', 'VLT') but actually I'd like to avoid that if possible. Actually, currently, I'm using WaitForPort, which times out after 10 seconds or so if the port doesn't appear

Cheers!
tygre is offline  
Old 02 December 2022, 06:50   #5
Thomas Richter
Registered User
 
Join Date: Jan 2019
Location: Germany
Posts: 3,233
Unfortunately, if ARexx does not provide this functionality, there is no possibility on the shell level. The "command not found" is printed by the shell, through its standard output, and not by the command, through the current output. The ">" only redirects the output of commands. You could try to redirect the error output via "*>" which works from shell V45 upwards, but I doubt that this is making any difference here as redirection kicks in too late (i.e. when the command is started, not when the shell is interpreting commands).

The System() function call provides this functionality, but I afraid ARexx interface to the shell is too "simple minded" to give you this possibility.
Thomas Richter is offline  
Old 02 December 2022, 14:52   #6
daxb
Registered User
 
Join Date: Oct 2009
Location: Germany
Posts: 3,304
Quote:
Originally Posted by tygre View Post
That's a good idea, Daxb, the do 5 while ~show('P', 'VLT') but actually I'd like to avoid that if possible.
I took that from ARexxGuide2 and I don't know any better way. I also don't like it much but I fear that is already the best way of doing it. If you have a better way some day, please share it. At least you can ignore what "run AmigaAMP" does or returns. Problem avoided.
daxb is offline  
Old 02 December 2022, 15:11   #7
tygre
Returning fan!
 
tygre's Avatar
 
Join Date: Jan 2011
Location: Montréal, QC, Canada
Posts: 1,434
Hi Thomas and Daxb!

Thanks a lot for your replies, I'll check if ARexx could "redirect" the output of Run, else I'll use Daxb's method

Cheers!
tygre is offline  
Old 02 December 2022, 22:11   #8
tygre
Returning fan!
 
tygre's Avatar
 
Join Date: Jan 2011
Location: Montréal, QC, Canada
Posts: 1,434
PS. At the end, I used WaitForPort because it straightforward and it either returns 0 immediately (if the port is available) or timeouts after 10 sec. and returns 5 (if the port is unavailable).

Code:
IF ~SHOW('P', programPort) THEN DO
   ADDRESS Command 'Run >' || tempFile || ' ' || programName
   ADDRESS Command 'WaitForPort ' || programPort
   IF RC ~= 0 THEN DO
      SAY 'Could not start ' || programName || ', is it in the path?'
      EXIT
   END
   SAY programName || ' has started.'
END
ELSE DO
   SAY programName || ' was already started.'
END
tygre is offline  
 


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools

Similar Threads
Thread Thread Starter Forum Replies Last Post
[opus5][arexx] "Lister Empty..." command - problem peceha Coders. Scripting 16 20 March 2018 09:42
AREXX Help Zetr0 support.Other 2 26 January 2011 23:09
arexx help jimbobrocks92 Coders. General 4 19 January 2011 12:50
Arexx redblade request.Apps 2 30 August 2006 11:51
Arexx Seti Coders. General 2 05 August 2003 18:59

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +2. The time now is 00:04.

Top

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.
Page generated in 0.07603 seconds with 15 queries