Обрабатывать одиночные квоты внутри оператора обратной квоты в rake/ruby

Мне нужно выполнить следующую команду оболочки и прочитать вывод в переменной rake:

`#{security_bin} find-identity -v -p codesigning #{keychain_path} | grep "$1" | awk -F\" '/"/ {print $2}' | head -n1`

Как вы можете видеть, я использую обратные кавычки, чтобы сообщить rake интерпретатору, что "это команда оболочки для выполнения". Проблема в том, что это не сработает, поскольку использование одинарных кавычек внутри вызова прерывает синтаксический анализ или что-то еще, а ruby ​​не знает, где заканчивается запись.

Я получаю следующую ошибку:

rake xamarin:create_keychain
Deleted the old one...
About to retrieve identity...
sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file

Функция, в рамках которой происходит поток, следующая (хотя я все еще подозреваю строку, упомянутую выше:

def create_temp_keychain(keychain_path, p12path)
    security_bin='/usr/bin/security'

    delete_keychain(keychain_path)

    `/usr/bin/security create-keychain -p tempass #{keychain_path}`
    `#{security_bin} set-keychain-settings -lut 7200 #{keychain_path}`
    `#{security_bin} unlock-keychain -p "tempass" #{keychain_path}`
    `#{security_bin} import #{p12path} -P "" -A -t cert -f pkcs12 -k #{keychain_path}`
    `#{security_bin} list-keychain -d user -s #{keychain_path} "login.keychain"`
    puts "About to retrieve identity..."
    identity_output = `#{security_bin} find-identity -v -p codesigning #{keychain_path} | grep "$1" | awk -F\" '/"/ {print $2}' | head -n1`
    puts identity_output
end

Как правильно выполнить следующую команду в ruby?

1 ответ

Решение

Двойные кавычки должны быть экранированы дважды как в:

awk -F\\" '...

чтобы обработать двойные кавычки оболочки в вызове оболочки на основе backtick в ruby.

Правильная строка будет:

`#{security_bin} find-identity -v -p codesigning #{keychain_path} | grep "$1" | awk -F\\" '/"/ {print $2}' | head -n1`

Кредит за ответ идет к @mudasobwa.

Другие вопросы по тегам