#ruby #io-redirection
Вопрос:
Рельсы 6.1.4.1 Тормозной механизм 5.1.1
Я обновляю устаревший проект rails, в котором есть следующая команда:
system("pg_dump -F c --no-acl --no-owner --quote-all-identifiers #{database_url} > #{file_name}")
Брейкман жалуется на ввод команды.
Одним из решений, которое я нашел в Интернете, было бы разделить команду на отдельные строки:
system('pg_dump', '-F', 'c', '--no-acl', '--no-owner', '--quote-all-identifiers', database_url, '>', file_name)
Однако теперь, похоже, он думает, что database_url > file_name
это часть аргументов, переданных pgdump, и не будет сбрасывать в file_name
Как я могу легко исправить эту линию?
Спасибо!
Комментарии:
1. Вы могли бы переключиться на Open3 и обрабатывать файл самостоятельно, вместо того, чтобы использовать перенаправление оболочки.
2. @akira : В качестве альтернативы (если вы не хотите использовать Open3), вы могли бы — вместо использования перенаправления вывода — перехватить вывод в переменную Ruby, а затем записать содержимое переменной в файл. Это предполагает, что ожидаемый результат не настолько велик, чтобы у вас закончилась память.
3. @akira : Еще одна идея. Я предполагаю (вы должны это проверить), что тормозной оператор проверяет
tainted?
и/илиuntrusted?
интерполированную строку для выдачи этого предупреждения. Если это так, вы можете вручную проверить, что строка безопасна, а затемuntaint
илиtrust
ее.
Ответ №1:
Быстрый взгляд на документы system
показывает, что:
Аргументы хэша, env и параметры, такие же, как
exec
иspawn
. Смотрите#spawn
подробности.
Среди множества вариантов spawn
есть перенаправление через key => value
. Ключом для stdout является :out
, и значение может быть строкой для указания имени файла:
system('pg_dump', '-F', 'c', '...', database_url, out: file_name)