Escaping backquote in filenames


#1

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 Lees Ping Pong Orchestra - Bollywood.mp3" => "[Shawn Lee]/10. Shawn Lees 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


#2

Hi,

At Thu, 22 Jan 2009 16:58:47 +0900,
Julien B. 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 Lees Ping Pong Orchestra - Bollywood.mp3" => "[Shawn Lee]/10. Shawn Lees 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)


#3

Nobuyoshi N. 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 Lees Ping Pong Orchestra - Bollywood.mp3" => "[Shawn Lee]/10. Shawn Lees 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.