Bash / Escaping quotes is driving me crazy . .

Gordon Messmer gordon.messmer at gmail.com
Mon Feb 22 16:56:54 UTC 2016


On 02/20/2016 07:18 PM, Philip Rhoades wrote:
> OK, that all makes sense but there is a further issue - I was trying 
> to keep it simple - this whole line is inside a Ruby "system" command ie:
>   system( "ssh .. " )
> I can't use the second option because I need to use double quotes so 
> that I can use Ruby variables inside the double quotes eg:

I think you're still missing some fundamental concepts about nesting 
quotes.  (I was also mistaken in suggesting that the wildcards needed 
escaping when the internal double-quotes were escaped, though, so...  We 
all make mistakes.)

In Ruby double-quoted strings, you can get interpolation, and in single 
quoted strings you don't.  But if you nest single quotes inside a 
double-quoted strings, Ruby still treats the entire string as double 
quoted.  It doesn't change the rules when it finds single quotes inside 
the double-quoted string, because they're merely a part of the 
double-quoted string.  So your options are:

system("ssh localhost \"find /home/... -maxdepth 1 -type f \\\\( -name 
\\\"*.mp3\\\" -o -name \\\"*.m4a\\\" -o -name \\\"*.flac\\\" \\\\)\" ")

or:

system("ssh localhost 'find /home/... -maxdepth 1 -type f \\( -name 
\"*.mp3\" -o -name \"*.m4a\" -o -name \"*.flac\" \\)' ")

Using single quotes means significantly less escaping, and you can still 
use interpolation in any part of that string, in Ruby.


More information about the users mailing list