Как избежать строк для терминала в Ruby?

Я пытаюсь запустить mplayer. Мое имя файла содержит пробелы, и их следует избегать. Это код, который я использую:

@player_pid = fork do
   exec "/usr/bin/mplayer #{song.file}"
end

где #{song.file} содержит путь, подобный "/home/example/music/01 - a song.mp3". Как я могу избежать этой переменной правильно (и, возможно, другие странные символы, которые могут содержать заголовок), чтобы терминал принял мою команду?

Ответы

Ответ 1

Shellwords должен работать для вас:)

exec "/usr/bin/mplayer %s" % Shellwords.escape(song.file)

В ruby ​​1.9.x, похоже, вам нужно require сначала

require "shellwords"

Но в ruby ​​2.0.x мне не нужно явно требовать его.

Ответ 2

Пожалуйста, никогда не используйте форму "одиночная командная строка" exec, которая оставляет вас открытой для всех обычных проблем с цитированием и вводом и бессмысленно запускает оболочку. Из прекрасного руководства:

exec (cmdname, arg1,...)

имя команды и один или несколько аргументов (без оболочки)

Итак, вместо того, чтобы сбрасывать с помощью кавычек и экранов, а что нет, просто используйте версию без оболочки:

exec '/usr/bin/mplayer', song.file

и полностью обходить оболочку. Аналогично для system.