Трубопровод Linux (вывод на печать) команды, которая ожидает аргумент файла - PullRequest
2 голосов
/ 10 июня 2019

Я знаю, что вы можете передать вывод одной команды другой - например,

ls -la | less

, чтобы увидеть вывод ls -la внутри less вместо терминала stdio.

Но если вы используете command с параметром, который сохраняет выходные данные в файл

command --save-to-file file.txt

Тогда как передать это другой команде?

этот способ не будет работать:

command --save-to-file | less

потому что команда будет жаловаться, что вы использовали --save-to-file без аргументов (имя файла)

Если я хорошо помню, в ram-файле было что-то вроде буфера или временного файла, который вы могли бы поместить вместоfile.txt чтобы вы могли сделать что-то вроде:

command --save-to-file ram-buffer.txt && cat ram-buffer.txt

Даже не создавая файл на диске, это правильно?

Зачем мне это нужно?

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

Я не хотел бы отвечать за создание файла tmp, затем удалять его и т. Д. В идеале я хотел бы просто использовать некий магический файл (или перенаправление) вместо file.txt, который я мог бы передать другой команде.

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

В данный момент я пытаюсь захватить вывод PHPUnit

phpunit --log-junit log.xml

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

#!/usr/bin/env php

Но я помню, что у меня был пример с командой linux, который я хотел получить, но его форма была доступна только с параметром --save-to-file outputfile.txt

Возможно, потому что передача / перенаправление вывода, предназначенного для сохранения в файл, не является бинарно-безопасной, и поэтому такой вывод может быть поврежден при пересылке / перенаправлении - может ли это быть?

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Как указал @Benjamin W. в комментариях, вы можете сохранить его в /dev/stdout, который является выходом, а затем направить вывод в любое, что вы хотите (например, меньше)

command --save-to-file /dev/stdout | less

Takeзаботиться, потому что может быть дополнительный вывод на стандартный вывод.В этом случае вы можете выбросить это, сохранить его в stderr и перенаправить в stdout:

команда - сохранить в файл / dev / stderr> / dev / null 2> / dev/ стандартный вывод |less

Если используются оба, stderr и stdout, вы можете написать свой собственный драйвер для манипуляции /proc/pid/mem или что-то вроде этого.

1 голос
/ 10 июня 2019

Некоторые программы имеют специальную обработку для -. Например, вы можете указать tar писать в стандартный вывод, чтобы его можно было использовать в конвейере. Это позволит создать тарбол локально и распаковать его удаленно без того, чтобы он был записан на диск:

tar -cf - *.txt | ssh user@host tar -C /dir/ -xf -

Вы можете использовать /dev/stdout практически со всеми программами, если им не нужен файл для поиска.

command --save-to-file /dev/stdout
...