How to run a program in a shell

Sarah Reichelt sarah.reichelt at gmail.com
Tue Sep 6 18:32:12 EDT 2005


> I have an app (runs on OSX) that is basically a website generator.
> Looks at some folders and puts some html wrappers around files there
> after a user enters some info. Two of the items entered are a
> username and password. The prog then generates all the html and
> should generate an .htaccess and .htpasswd files.
> 
> What I need is to run htpasswd to generate the encrypted password
> for .htaccess
> 
> The problem is that REV won't let me run or even launch a shell. It's
> supposed to work, but it just doesn't.
> 
> If anybody knows how to run a shell prog and return it's result I
> would REALLY appreciate any help.
> 
Hi Wally,

I have done this many times without problem, although I have never
tried it with the htpasswd command.

For a simple command, I use somethig like this:

  put "cd /Users/sarah/Desktop/" & cr & "pwd" into tCmd  -- put the
shell command into a variable
  put shell(tCmd) into tResult  -- do the shell command and get the result
  put tResult into fld 1  -- display the result

As you can see, I was able to use a 2 line series of commands, by just
joining them together with a line break.

If the shell command requires sudo, then it gets a bit more
complicated, but here is how I do it (this example sets the system
clock):

  put "#!/bin/sh" & cr into tScript
  put "pw=" & quote & tPass & quote & cr after tScript
  put "echo $pw | sudo -S date " & tDate & tTime & cr after tScript 
-- build the command lines
  put shell(tScript) into tCheck  -- do the command & get the result

You have to quote your admin password, but you can ask for that when
running the script.

Finally, you sometimes need to run a shell command in the background.
In this case, I use the following syntax, which puts the result into a
text file. I then set up a regular check to see if the text file is
there and read the result when it's ready (this example pings an IP
address, waiting up to 15 seconds for the result, but not blocking
anything else from happening during that time):

function checkPing pIP
  put specialFolderPath("Desktop") & "/ping.txt" into tFileName
  if there is a file tFileName then delete file tFileName
  
  put "ping -c1 -n "  & pIP into tShellCmd
  put " > " & tFileName & " 2>&1 &" after tShellCmd
  get shell(tShellCmd)
   
  repeat 15 times
    wait 1 second with messages
    if there is a file tFileName then
      put URL ("file:" & tFileName) into tRes
      if tRes is empty then next repeat  -- file created but no result yet
      
      put wordOffset("loss", tRes) into tWord
      if tWord = 0 then next repeat -- file created but result not complete
      
      put word tWord-2 of tRes into tPercent
      if tPercent = "0%" then return true
      else return false
    end if
  end repeat
  
  return false
end checkPing

I hope these examples help, but if you want any further advice or
testing, let me know.

Cheers,
Sarah



More information about the use-livecode mailing list