Обрабатывать одиночные квоты внутри оператора обратной квоты в 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.