l i n u x - u s e r s - g r o u p - o f - d a v i s
Next Meeting:
July 7: Social gathering
Next Installfest:
Latest News:
Jun. 14: June LUGOD meeting cancelled
Page last updated:
2001 Dec 30 17:14

The following is an archive of a post made to our 'vox-tech mailing list' by one of its subscribers.

Report this post as spam:

(Enter your email address)
Re: [vox-tech] quoting question in perl
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [vox-tech] quoting question in perl

On Sat, 22 Dec 2001, Harry Souders wrote:

> On Thu, Dec 20, 2001 at 05:06:29PM -0800, Peter Jay Salzman wrote:
> > if you have:
> > 
> > system("rm $filename");
> > 
> > and $filename = "a file", you get an error because you're trying to delete
> > two files, "a" and "file".
> > 
> > what's the proper way of quoting $filename so that the shell sees the file
> > "a file" and not the two non-existant files "a" and "file"?
> There are probably better ways, but this might work:
> system("rm -- $filename");

The "--" option handles a different problem.

The rm command, like most *nix commands, accepts various options.  It
cannot tell the difference between an option and a filename that begins
with a dash.  The "--" option prevents rm from interpreting any further
parameters as options, even if they begin with dashes.

The "a file" problem arises in the shell parsing, not the innards of the
command parsing its parameters.  Thus, the rm command posed by pete would
see three parameters: an option, followed by "a" and "file".  The shell
parsing has to be handled properly first in order for rm to have a chance
to do its work.

This is complicated by the fact that Perl is handling escapes and
substitutions in the string, then the shell is handling escapes and 
substitutions, and then it is parsing the result of that,
and then the rm command sees the result of all that.

The rm command should see "a file" as a single string (no quotes).  
Quoting it in the shell with either a single or double quote accomplishes
this.  But you have to encode a string in Perl that it can understand to
create the proper string to give to the shell.

perl source:              shell (after shell expansion):
$x="a file";                              #definition of $x in perl

                          $x="-r tmp"     #definition of $x in shell

system("rm -r tmp");      rm -r tmp       #recursively remove tmp and
                                          #its subdirectory

system("rm -- -r tmp");   rm -- -r tmp    #removes two files: "-r" and tmp

system('rm $x');          rm -r tmp       #single quotes in perl prevent
                                          #expansion in perl
                                          #shell substitutes
                                          #rm recursively deletes tmp

system("rm $x");          rm a file       #double quotes in perl allow
                                          #expansion in perl
                                          #shell never sees $x
                                          #rm sees two arguments

system("rm '$x'");        rm 'a file'     #single quotes inside double
                                          #quotes are part of perl string
                                          #so expansion in perl proceeds
                                          #shell never sees $x
                                          #rm sees one argument

system("rm \"$x\"");      rm "a file"     #same as last example

Jeff Newmiller                        The     .....       .....  Go Live...
DCN:<jdnewmil@dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live Go...
                                      Live:   OO#.. Dead: OO#..  Playing
Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
/Software/Embedded Controllers)               .OO#.       .OO#.  rocks...2k

vox-tech mailing list

LUGOD Group on LinkedIn
Sign up for LUGOD event announcements
Your email address:
LUGOD Group on Facebook
'Like' LUGOD on Facebook:

Hosting provided by:
Sunset Systems
Sunset Systems offers preconfigured Linux systems, remote system administration and custom software development.

LUGOD: Linux Users' Group of Davis
PO Box 2082, Davis, CA 95617
Contact Us

LUGOD is a 501(c)7 non-profit organization
based in Davis, California
and serving the Sacramento area.
"Linux" is a trademark of Linus Torvalds.

Sponsored in part by:
Sunset Systems
Who graciously hosts our website & mailing lists!