Ответ 1
Shellwords должен работать для вас:)
exec "/usr/bin/mplayer %s" % Shellwords.escape(song.file)
В ruby 1.9.x, похоже, вам нужно require
сначала
require "shellwords"
Но в ruby 2.0.x мне не нужно явно требовать его.
Я пытаюсь запустить mplayer. Мое имя файла содержит пробелы, и их следует избегать. Это код, который я использую:
@player_pid = fork do
exec "/usr/bin/mplayer #{song.file}"
end
где #{song.file}
содержит путь, подобный "/home/example/music/01 - a song.mp3"
. Как я могу избежать этой переменной правильно (и, возможно, другие странные символы, которые могут содержать заголовок), чтобы терминал принял мою команду?
Shellwords должен работать для вас:)
exec "/usr/bin/mplayer %s" % Shellwords.escape(song.file)
В ruby 1.9.x, похоже, вам нужно require
сначала
require "shellwords"
Но в ruby 2.0.x мне не нужно явно требовать его.
Пожалуйста, никогда не используйте форму "одиночная командная строка" exec
, которая оставляет вас открытой для всех обычных проблем с цитированием и вводом и бессмысленно запускает оболочку. Из прекрасного руководства:
exec (cmdname, arg1,...)
имя команды и один или несколько аргументов (без оболочки)
Итак, вместо того, чтобы сбрасывать с помощью кавычек и экранов, а что нет, просто используйте версию без оболочки:
exec '/usr/bin/mplayer', song.file
и полностью обходить оболочку. Аналогично для system
.