我想定义一个函数来包装%x
,如下所示
def myx(arg)
puts %x("#{arg}")
end
拨打myx("ls")
即可,但无法拨打myx("ls /usr")
。错误消息是
sh:1:ls / usr:not found
我理解错误。这是因为整个单词ls /usr
被视为传递给shell的单个参数。但是我该如何解决这个问题?
答案 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
来清除引号。