2014-01-19 6 views
1

Я пытаюсь выполнить программу Python, перенаправить свой вывод в файл и сравнить содержимое этого файла с существующим, все в одной команде оболочки. Это то, что у меня есть, но, конечно, это не работает:Возможно ли выполнить программу Python между обратными тактами в команде оболочки?

diff `python3 program.py > redirect_file.txt` compare_file.txt 

Я нуб Linux, так что любая помощь, указывая мне в правильном направлении, было бы здорово.

+0

Вам нужно перенаправить вывод сценария в файл или просто хотите сравнить его с другим файлом? –

ответ

9

дифф команды позволяет использовать - в командной строке, чтобы использовать стандартный ввод, так что попробуйте:

python3 program.py | diff - compare_file.txt 
+0

+1 абсолютно лучший способ сделать это. Теперь, когда мы говорим о Unix, вы должны добавить строку [shebang] (https://en.wikipedia.org/wiki/Shebang_ (Unix)), чтобы вам не нужно явно указывать интерпретатор. – Cu3PO42

4

Попробуйте это:

python3 program.py > redirect_file.txt && diff redirect_file.txt compare_file.txt 
5

вашей команде

diff `python3 program.py > redirect_file.txt` compare_file.txt 

не работает из-за неправильного использования обратных выходов. Backticks отличаются от двойных кавычек только тем, что их содержимое оценивается оболочкой и заменяется стандартным выходом. Поскольку вы перенаправили стандартный вывод команды в файл, backticks теперь оценивают пустую строку. Таким образом, ваша команда эквивалентна:

python3 program.py > redirect_file.txt 
diff "" compare_file.txt 

Но вы хотите:

python3 program.py > redirect_file.txt 
diff redirect_file.txt compare_file.txt 

Если redirect_file.txt используется только для сравнения, вы можете не создавать его и ускорить процесс:

python3 program.py | diff - compare_file.txt 

Используется труба (|), которая в основном соединяет стандартный вывод команды слева со стандартным вводом команды справа. Diff читает стандартный ввод, если вместо фактического имени файла указывается -, что является довольно распространенным соглашением среди утилит оболочки.

Вы также можете использовать Bash-специфический синтаксис

diff <(python3 program.py) compare_file.txt 

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

+0

+1 для ответа, который на самом деле лучше и более исчерпывающий, чем мой, и заслуживает большего внимания. –