2014-06-18 82 views
1

我要定義一個函數來包裝%x如下定義紅寶石功能包%×

def myx(arg) 
    puts %x("#{arg}") 
end 

這是確定調用myx("ls")但沒有打電話myx("ls /usr")。該錯誤消息是

SH:1:LS/USR:找不到

我理解錯誤。這是因爲整個單詞ls /usr被視爲傳遞給shell的單個參數。但我該如何解決這個問題?

+0

爲什麼不'def myx(arg);放\'#{arg} \'; end' – huocp

回答

2

不要在%x中引用"的命令行。

arg = "ls /usr" 
%x("#{arg}") 

將發送"ls /usr"作爲單個參數的系統,因爲如果執行殼以下:

$ "ls /usr" 

系統將嘗試找到一個名爲ls /usr的命令/可執行文件,從而導致你遇到的問題。因此,更新方法下面的工作

def myx(arg) 
    puts %x(#{arg}) 
end 
myx('ls /usr') 

以前的答案

def myx(arg) 
    puts %x("#{arg}") 
end 

myx('"ls /usr"') 

的作品,如果你執行的外殼下面爲:

$ ""ls /usr"" 
# which results in 
$ ls /usr 

那不是引用命令,相反,它使用額外的"來清除報價。

3

請務必註明您的整個命令字符串內:

def myx(arg) 
    puts %x("#{arg}") 
end 

myx('"ls /usr"') 

或者反引號不需要串被引用:

def myx(arg) 
    puts `#{arg}` 
end 

myx("ls /usr") 

即使在我看來更好:

def myx(arg) 
    system(*arg) 
end 

myx(['ls', '/usr']) 

輸出:

bin 
games 
include 
lib 
lib32 
lib64 
libx32 
local 
sbin 
share 
src 

前兩個將整個命令作爲字符串傳遞給shell執行。最後一個繞過shell,ruby自己執行它。

+0

'''ls/usr「''是什麼意思?爲什麼要用單引號和雙引號? –