定义一个ruby函数来包装%x

时间:2014-06-18 02:35:38

标签: ruby

我想定义一个函数来包装%x,如下所示

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

拨打myx("ls")即可,但无法拨打myx("ls /usr")。错误消息是

  

sh:1:ls / usr:not found

我理解错误。这是因为整个单词ls /usr被视为传递给shell的单个参数。但是我该如何解决这个问题?

2 个答案:

答案 0 :(得分: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自己执行它。

答案 1 :(得分:2)

请勿在{{1​​}}中使用"引用命令行。

%x

arg = "ls /usr" %x("#{arg}") 作为单个参数发送到系统,就像在shell中执行以下命令一样:

"ls /usr"

系统将尝试查找名为$ "ls /usr" 的命令/可执行文件,这会导致您遇到的问题。因此,将您的方法更新为以下内容将起作用

ls /usr

上一个答案

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

就像在shell中执行以下操作一样:

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

myx('"ls /usr"')

这不是引用命令,而是使用额外的$ ""ls /usr"" # which results in $ ls /usr 来清除引号。