2014-06-18 62 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“''是什么意思?为什么要用单引号和双引号? –