Как перенаправить «системный» вызов при передаче параметров в качестве отдельных аргументов?

#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)