Forum: Ruby Escaping backquote in filenames

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
E8ea895a56fb370bd3f678f774fe290a?d=identicon&s=25 Julien Biard (brasco)
on 2009-01-22 09:01
(Received via mailing list)
Hi,

I would like to execute call system on a filename with a backquote (`),
but I don't know how to escape it.

-> ls "[Shawn Lee]/10. Shawn Lee\`s Ping Pong Orchestra - Bollywood.mp3"
-rw-r--r-- 1 hobs medias 3,0M 2009-01-18 15:16 [Shawn Lee]/10. Shawn
Lee`s Ping Pong Orchestra - Bollywood.mp3

>> s = "[Shawn Lee]/10. Shawn Lee`s Ping Pong Orchestra - Bollywood.mp3"
=> "[Shawn Lee]/10. Shawn Lee`s Ping Pong Orchestra - Bollywood.mp3"
>> `ls "#{s}"`
sh: -c: line 0: unexpected EOF while looking for matching ``'
sh: -c: line 1: syntax error: unexpected end of file

>> s2 = "[Shawn Lee]/10. Shawn Lee\`s Ping Pong Orchestra - Bollywood.mp3"
=> "[Shawn Lee]/10. Shawn Lee`s Ping Pong Orchestra - Bollywood.mp3"
>> `ls "#{s2}"`
sh: -c: line 0: unexpected EOF while looking for matching ``'
sh: -c: line 1: syntax error: unexpected end of file

>> s3 = "[Shawn Lee]/10. Shawn Lee\\`s Ping Pong Orchestra - Bollywood.mp3"
=> "[Shawn Lee]/10. Shawn Lee\\`s Ping Pong Orchestra - Bollywood.mp3"
>> `ls "#{s3}"`
ls: cannot access [Shawn Lee]/10. Shawn Lee`s Ping Pong Orchestra -
Bollywood.mp3: No such file or directory

Any idea ?


Regards,


Julien
F1d6cc2b735bfd82c8773172da2aeab9?d=identicon&s=25 Nobuyoshi Nakada (nobu)
on 2009-01-22 09:35
(Received via mailing list)
Hi,

At Thu, 22 Jan 2009 16:58:47 +0900,
Julien Biard wrote in [ruby-talk:325582]:
> I would like to execute call system on a filename with a backquote (`),
> but I don't know how to escape it.

Escaping depends on platforms.

> -> ls "[Shawn Lee]/10. Shawn Lee\`s Ping Pong Orchestra - Bollywood.mp3"
> -rw-r--r-- 1 hobs medias 3,0M 2009-01-18 15:16 [Shawn Lee]/10. Shawn
> Lee`s Ping Pong Orchestra - Bollywood.mp3
>
> >> s = "[Shawn Lee]/10. Shawn Lee`s Ping Pong Orchestra - Bollywood.mp3"
> => "[Shawn Lee]/10. Shawn Lee`s Ping Pong Orchestra - Bollywood.mp3"

In 1.8.7 or later, Shellwords.escape exists.

  require 'shellwords'
  `ls #{Shellwords.escape(s)}`

Or, multiple arugment #exec bypasses shell.

  IO.popen("-") {|f| f or exec("ls", s); f.read}

In 1.9, IO.popen can handle an array argument.

  IO.popen(["ls", s], &:read)
E8ea895a56fb370bd3f678f774fe290a?d=identicon&s=25 Julien Biard (brasco)
on 2009-01-22 10:25
(Received via mailing list)
Nobuyoshi Nakada wrote:
>> -rw-r--r-- 1 hobs medias 3,0M 2009-01-18 15:16 [Shawn Lee]/10. Shawn
>> Lee`s Ping Pong Orchestra - Bollywood.mp3
>>
>>>> s = "[Shawn Lee]/10. Shawn Lee`s Ping Pong Orchestra - Bollywood.mp3"
>> => "[Shawn Lee]/10. Shawn Lee`s Ping Pong Orchestra - Bollywood.mp3"
>
> In 1.8.7 or later, Shellwords.escape exists.
>
>   require 'shellwords'
>   `ls #{Shellwords.escape(s)}`
I am using 1.8.6.

>
> Or, multiple arugment #exec bypasses shell.
>
>   IO.popen("-") {|f| f or exec("ls", s); f.read}
Thanks, it works.
This topic is locked and can not be replied to.