我要定義一個函數來包裝%x
如下定義紅寶石功能包%×
def myx(arg)
puts %x("#{arg}")
end
這是確定調用myx("ls")
但沒有打電話myx("ls /usr")
。該錯誤消息是
SH:1:LS/USR:找不到
我理解錯誤。這是因爲整個單詞ls /usr
被視爲傳遞給shell的單個參數。但我該如何解決這個問題?
我要定義一個函數來包裝%x
如下定義紅寶石功能包%×
def myx(arg)
puts %x("#{arg}")
end
這是確定調用myx("ls")
但沒有打電話myx("ls /usr")
。該錯誤消息是
SH:1:LS/USR:找不到
我理解錯誤。這是因爲整個單詞ls /usr
被視爲傳遞給shell的單個參數。但我該如何解決這個問題?
不要在%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
那不是引用命令,相反,它使用額外的"
來清除報價。
請務必註明您的整個命令字符串內:
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自己執行它。
'''ls/usr「''是什麼意思?爲什麼要用單引號和雙引號? –
爲什麼不'def myx(arg);放\'#{arg} \'; end' – huocp