使用Ruby在shell的字符串中使用单引号时,我得到sh:-c:line 0:在查找匹配的`'';

使用Ruby在shell的字符串中使用单引号时,我得到sh:-c:line 0:在查找匹配的`'';,ruby,bash,Ruby,Bash,这在Ruby中工作得很好,应该可以: 将“不”放在后面 但我想在BASH中用Ruby运行同样的程序: %x(回显“不要”) 我得到这个错误: sh:-c:第0行:查找匹配项时出现意外EOF` “`,system(),Open3 我的实际代码片段: require 'open3' module XdoTool BIN = 'xdotool' EXEC = ::ENV['PATH'].split(::File::PATH_SEPARATOR).map { |path| ::File

这在Ruby中工作得很好,应该可以:

将“不”放在后面

但我想在BASH中用Ruby运行同样的程序:

%x(回显“不要”)

我得到这个错误:
sh:-c:第0行:查找匹配项时出现意外EOF`

“`,
system()
Open3

我的实际代码片段:

require 'open3'

module XdoTool
    BIN = 'xdotool'
    EXEC = ::ENV['PATH'].split(::File::PATH_SEPARATOR).map { |path| ::File.join(path, BIN) if ::File.executable?(::File.join(path, BIN)) }.compact.last
    raise RuntimeError, "No #{BIN} found in the exported paths. Please make sure you have #{BIN} installed" unless EXEC

    class << self
        def type(str)
            Open3.capture2("#{EXEC} type --delay 0 '#{str = str.gsub("'", '\'')}'")
            str
        end
    end
end

# Types the quoted text anywhere.
XdoTool.type("What is the reason of the error?")


# sh: -c: line 0: unexpected EOF while looking for matching `''
# sh: -c: line 1: syntax error: unexpected end of file
XdoTool.type("What's the reason of the error?")
需要“open3”
模块XdoTool
BIN='xdool'
EXEC=::ENV['PATH'].split(::File::PATH_SEPARATOR).map{| PATH |::File.join(PATH,BIN)if::File.executable?(::File.join(PATH,BIN))}.compact.last
引发运行时错误,“在导出的路径中找不到#{BIN}。请确保已安装#{BIN}”,除非执行

类在shell中,您不能在单个带引号的字符串中包含单个引号。它必须位于双引号字符串中。这意味着,如果希望参数同时包含这两个参数,则需要将单独引用的Sting连接在一起

echo 'He said "I can'"'"t'"'
或者在双引号字符串中转义双引号

echo "He said \"I can't\""
(有些shell提供了另一种形式的引用,可以包含转义的单引号,即
$”,他说“我不能”
。然而,这是POSIX标准的扩展,您不能假设它受
shell Ruby将用于执行您的命令。)

尝试使用双引号
echo“don't”
。Bash不在一组单引号中处理转义单引号,而我不能。str参数也可以有双引号。这取决于用户。使用“”将阻止在内部使用“”。我想避免引用。但由于某些奇怪的原因,这在sh或BASH中有效,但在Ruby中不适用于sh!我无法找到原因。非常感谢您的评论。我现在已经这样做了:
str=str.gsub(“”,(“\\”)
Open3.capture2(“{EXEC}type--delay 0\”)
现在它可以工作了!我还必须
str=str.gsub(''',(\\\\).gsub('$,'\$)
因为否则,如果我的参数像“$HOME”一样,它会键入
/HOME/sourav
您最好使用
capture2的形式,它将命令名及其参数作为列表,而不是由shell解析的单个字符串(我对Ruby的知识还不太清楚),因此您不需要提前转义任何引号。最后一条注释(没有额外的字符串插入:
Open3.capture2(EXEC,'type','-delay,'0',str)
)应该是您的答案。这里根本不需要乱搞转义和shell。