Есть ли команда Linux, которая записывает свои аргументы командной строки в файл, без использования оболочки? - PullRequest
0 голосов
/ 15 января 2019

У меня есть система пакетной обработки, которая может выполнять несколько команд последовательно. Эти команды указываются в виде списка слов, которые выполняются функцией subprocess.call() python, без с использованием оболочки. По разным причинам я не хочу менять систему обработки.

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

Так есть ли способ написать командную строку Linux, которая будет принимать аргумент и записывать его в файл, в контексте, где он выполняется вне оболочки?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Глядя на документы для subprocess.call , я вижу, что у него есть дополнительные параметры:

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

Если вы укажете stdout= для файла, который вы открыли, то вывод вашего кода будет идти к этому файлу, что в основном такое же поведение?

Я не вижу вашего точного варианта использования, но это, безусловно, способ синтезировать поведение канала командной строки с небольшим изменением кода.

Обратите внимание, что в документах также сказано, что вам не следует использовать встроенную поддержку = PIPE, в зависимости от ваших конкретных требований. Важно, чтобы вы регулярно читали данные из канала, иначе устройство записи остановится, когда буфер заполнится.

0 голосов
/ 15 января 2019

Что ж, можно написать обобщенный анализатор и менеджер процессов, который бы справился с этим за вас, но, к счастью, он уже поставляется с Linux. Все, что вам нужно сделать, это сказать, какую команду запустить, и она будет обрабатывать перенаправление для вас.

Итак, если бы вы немного изменили свои команды, вы могли бы легко это сделать. Просто объедините слова вместе со строками, заключив в кавычки, когда в этих словах могут быть пробелы или другие специальные символы, и тогда вы можете использовать список, такой как:

/bin/sh, -c, {your new string here} > /some/file

Et вуаля, материал записан на диск. :)

...