Boston Linux & Unix (BLU) Home | Calendar | Mail Lists | List Archives | Desktop SIG | Hardware Hacking SIG
Wiki | Flickr | PicasaWeb | Video | Maps & Directions | Installfests | Keysignings
Linux Cafe | Meeting Notes | Blog | Linux Links | Bling | About BLU

BLU Discuss list archive


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

thorny script argument escaping problem



Matthew Gillen wrote:
> Robert La Ferla wrote:
>> The wrapper script should pass all arguments
>> "verbatim" to the Java program.
>> The problem is that some arguments take a quoted string like:
>> The shell is unescaping the arguments...
> 
> Two obvious things you could do:
> 1) Within your script, add quotes around every arg. ...
> but you will horribly mangle things if the quote type you choose to use are
> already embedded in the arguments passed to your script.

You could also escape spaces and avoid the quoting issue, although this 
introduces other complications, as you don't want to escape spaces 
inside quotes that cause the shell not to remove the escaping character.


> 2) Don't use system().  Use an fork/exec combination, which expects a
> broken-up argument list.

This is probably the better approach. Perl's system() will provide the 
desired behavior if you pass it a list:

     system LIST
         Does exactly the same thing as "exec LIST", except that a fork
         is done first, and the parent process waits for the child
         process to complete. Note that argument processing varies
         depending on the number of arguments. If there is more than one
         argument in LIST, or if LIST is an array with more than one
         value, starts the program given by the first element of the list
         with arguments given by the rest of the list. If there is only
         one scalar argument, the argument is checked for shell
         metacharacters, and if there are any, the entire argument is
         passed to the system's command shell for parsing (this is
         "/bin/sh -c" on Unix platforms, but varies on other platforms).
         If there are no shell metacharacters in the argument, it is
         split into words and passed directly to "execvp", which is more
         efficient.

So your wrapper becomes (untested):

@cmd = qw/java MyClass/;
system(@cmd, at ARGV);


  -Tom

-- 
Tom Metro
Venture Logic, Newton, MA, USA
"Enterprise solutions through open source."
Professional Profile: http://tmetro.venturelogic.com/




BLU is a member of BostonUserGroups
BLU is a member of BostonUserGroups
We also thank MIT for the use of their facilities.

Valid HTML 4.01! Valid CSS!



Boston Linux & Unix / webmaster@blu.org