Bash / Escaping quotes is driving me crazy . .

Philip Rhoades phil at pricom.com.au
Sun Feb 21 03:18:45 UTC 2016


Gordon,


> Date: Sat, 20 Feb 2016 16:40:01 -0800
> From: Gordon Messmer <gordon.messmer at gmail.com>
> To: Community support for Fedora users <users at lists.fedoraproject.org>
> Subject: Re: Bash / Escaping quotes is driving me crazy . .
> Message-ID: <56C90761.4070509 at gmail.com>
> Content-Type: text/plain; charset=utf-8; format=flowed
> 
> On 02/20/2016 04:05 PM, Philip Rhoades wrote:
>> . . but why is there only a problem with the "flac" OR? - all three
>> files have at least one space in the filename:
> 
> Your mistake seems to be believing that the shell can understand the 
> way
> you're nesting quotes.  It can't.  Each unescaped quote you're using
> simply terminates the quoted string that preceded it.  So your example:
> 
>    ssh localhost "find
> /home/phil/music/ambient/RobertGass+OnWingsOfSong/OmNamahaShivaya
> -maxdepth 1 -type f \\( -name "*.mp3" -o -name "*.m4a" -o -name 
> "*.flac"
> \\)"
> 
> There are the following quoted strings:
> 
> "find /home/phil/music/ambient/RobertGass+OnWingsOfSong/OmNamahaShivaya
> -maxdepth 1 -type f \\( -name "
> " -o -name "
> " -o -name "
> " \\)"
> 
> This means two things: First, the wildcards are unquoted when the
> command is run on the remote system.  Second, the wildcards are also
> unquoted on the local system.  So, if there are any mp3, m4a, or flac
> files in the directory where you run that command, or in the default
> login directory on the remote system, the wildcard will be expanded and
> find will only search for files with that specific name.
> 
> Instead, use single quotes around the entire command, or escape both 
> the
> quotes and the wildcards.
> 
>    ssh localhost "find
> /home/phil/music/ambient/RobertGass+OnWingsOfSong/OmNamahaShivaya
> -maxdepth 1 -type f \\( -name \"\*.mp3\" -o -name \"\*.m4a\" -o -name
> \"\*.flac\" \\)"
> 
>    ssh localhost 'find
> /home/phil/music/ambient/RobertGass+OnWingsOfSong/OmNamahaShivaya
> -maxdepth 1 -type f \( -name "*.mp3" -o -name "*.m4a" -o -name "*.flac" 
> \)'


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 .. " )

- so my working version is the same as your first option (without the 
escaped '*'s) but with an extra '\' at each place.  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:

   #{path}

Thanks for the explanation!

Regards,

Phil.
-- 
Philip Rhoades

PO Box 896
Cowra  NSW  2794
Australia
E-mail:  phil at pricom.com.au


More information about the users mailing list