2013-07-04 6 views
17

mplayer를 시작하려고합니다. 내 파일 이름에 공백이있어 이스케이프해야합니다. 이 내가 사용하고있는 코드입니다 : #{song.file}"/home/example/music/01 - a song.mp3" 같은 경로를 포함Ruby에서 터미널의 문자열을 이스케이프 처리하는 방법은 무엇입니까?

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

. 터미널이 내 명령을 받아 들일 수 있도록이 변수를 적절하게 이스케이프 처리하려면 어떻게해야합니까?

답변

29

Shellwords 당신을 위해 작동합니다 :) 루비 1.9.x에서

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

, 보이는 당신이 require 그것을

require "shellwords" 

에 그러나 루비의 2.0.x에서 가지고있는 것처럼, 나는 그것을 명시 적으로 요구할 필요가 없었습니다.

+0

고마워요! – xorinzor

15

"single command line"형태 인 exec을 사용하지 마십시오. 모든 일반적인 인용 및 삽입 문제를 해결하고 쉘을 무의미하게 실행합니다.

간부 (CMDNAME, ARG1, ...)

명령 이름과 하나 이상의 인수 (NO 쉘)

그래서 대신에 인용 주위에 비료를 다음 fine manual에서 탈출하고 무엇을하지 않겠습니까? 쉘없는 버전을 사용하십시오 :

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

etely. system에 대해서도 마찬가지입니다.

+1

어려운 점은 모든 사람이'/ usr/bin/mplayer' 경로를 가지고있는 것은 아니기 때문에 실행 파일을 찾기위한 메커니즘을 참조해야 할 수도 있습니다. 물론,이 프로그램이 당신의 소비만을위한 것이라면, 괜찮을 것입니다. – vgoff

+0

이 솔루션은 너무 참으로 작동하지만 내 질문에 실제로 어떻게 내 대답을 변경하지 않고 떠날거야 문자열을 탈출하는 방법에 대한, 덕분에. – xorinzor

+0

@vgoff :'exec'가'PATH'를 검색한다는 것을 알고 있습니까? 그리고'/ usr/bin/mplayer'를'exec'의 형태로 사용하려하고'/ usr/bin'에'mplayer'가 없다면 물론 두 경우 모두 실패합니다. –

관련 문제