При использовании одинарной кавычки в строке в оболочке с Ruby я получаю sh: -c: line 0: неожиданный EOF при поиске соответствия `'' - PullRequest
0 голосов
/ 11 февраля 2019

Это прекрасно работает в Ruby, и должно работать:

puts 'don\'t'

Но я хочу запустить то же самое в BASH с Ruby:

%x(echo 'don\'t')

Я получаю эту ошибку: sh: -c: line 0: unexpected EOF while looking for matching '' `

Та же ошибка возникает с` `, 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?")

Обратите внимание, что на улице может быть что угодно.Он может содержать буквенно-цифровые символы, символы, смайлики или комбинации всех этих вещей.Как я могу обойти проблему с кавычками здесь?

1 Ответ

0 голосов
/ 11 февраля 2019

В оболочке вы просто не можете включить одиночную кавычку в одиночную кавычку.Он должен быть в строке в двойных кавычках.Это означает, что если вам нужен аргумент, содержащий и , вам необходимо объединить отдельно заключенные в кавычки строки.

echo 'He said "I can'"'"t'"'

или экранировать двойные кавычки внутри строки в двойных кавычках

echo "He said \"I can't\""

(В некоторых оболочках есть еще одна форма цитирования, в которой может содержать экранированную одинарную кавычку, а именно $'He said "I can\'t"'. Однако это расширение стандарта POSIX, которое вы не можете считатьподдерживается оболочкой, которую Ruby будет использовать для выполнения вашей команды.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...