Перенаправить вывод команды [duplicate]

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

Тестирование модуля

За последние два года я написал проект хобби, и я не писал для него модульные тесты. После того, как я написал около 50 тыс. Строк, я узнал, что действительно нужно будет писать модульные тесты. Я не использовал интерфейсы (или очень экономно) ... и когда я сделал свой первый модульный тест, я узнал, что это сложно. Почему?

Поскольку мне приходилось делать много экземпляров классов, используемых для ввода в качестве переменных класса и / или параметров. Таким образом, тесты больше походят на интеграционные тесты (нужно сделать полную «инфраструктуру» классов, поскольку все было связано друг с другом).

Страх интерфейсов Итак, я решил использовать интерфейсы. Мой страх состоял в том, что мне приходилось выполнять всю функциональность везде (во всех используемых классах) несколько раз. В некотором роде это верно, однако, используя наследование, его можно значительно уменьшить.

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

public interface IPricable
{
    int Price { get; }
}

public interface ICar : IPricable

public abstract class Article
{
    public int Price { get { return ... } }
}

public class Car : Article, ICar
{
    // Price does not need to be defined here
}

Таким образом, копирование кода не требуется, но при этом полезно использовать автомобиль в качестве интерфейса (ICar).

75
задан Jens 19 August 2015 в 13:38
поделиться

6 ответов

вы можете перенаправить вывод времени с помощью

(time ls) &> file

Поскольку вам нужно взять (время ls) как одну команду, чтобы вы могли использовать фигурные скобки.

85
ответ дан Motti 22 August 2018 в 12:06
поделиться
  • 1
    да, действительно хорошо, но вопрос в том, как они это сделали? – abubacker 9 March 2010 в 13:41
  • 2
    команда time примет аргументы как команду. Но скобки будут группировать это как одну команду. Пример: время ls & gt; file1.txt В аргументах 0 = время 1 = "ls & gt; file1.txt & Quot; – sganesh 9 March 2010 в 13:49
  • 3
    Команда time выводит результат в stderr. Таким образом, вы можете использовать (время ls) 2 & gt; файл – sganesh 9 March 2010 в 13:54
  • 4
    Разъяснение на &>, пожалуйста, где я могу узнать об этом? – hello_there_andy 21 February 2017 в 00:47
  • 5
    @hello_there_andy &>file аналогичен >file 2>&1. Он направляет как stdout, так и stderr. – ktbiz 17 August 2017 в 02:21

Если вы не хотите смешивать вывод с time и командой. С GNU-временем вы можете использовать -o file, например:

/usr/bin/time -o tim grep -e k /tmp 1>out 2>err

, а tim - время, out и err - stdout и stderr из grep.

3
ответ дан Ding-Yi Chen 22 August 2018 в 12:06
поделиться

нет необходимости запускать подклассу. Использовать кодовый блок также будет.

{ time ls; } 2> out.txt

или

{ time ls > /dev/null 2>&1 ; } 2> out.txt
110
ответ дан ghostdog74 22 August 2018 в 12:06
поделиться
  • 1
    +1, Лучший ответ – Tim Post♦ 9 March 2010 в 14:19
  • 2
    Согласен, лучший ответ. Дает вам возможность вырезать результаты ls и просто получить время. Спасибо, ghostdog74 – rd42 10 September 2011 в 12:43
  • 3
    Это работало с AIX, когда ничто не могло перенаправить вывод «hostent». команда. Спасибо! – Hugo 1 May 2015 в 04:04
  • 4
    Пояснение на 2> пожалуйста. Где я могу узнать об этом? – hello_there_andy 21 February 2017 в 00:47
  • 5
    как это сделать, если я хочу, чтобы и & gt; и 2 & gt; в то же время? – Jorge Fernández 16 May 2017 в 15:29

время - это встроенная оболочка, и я не уверен, есть ли способ перенаправить ее. Однако вместо этого вы можете использовать /usr/bin/time, которые определенно согласуются с любыми перенаправлением вывода.

9
ответ дан Michal Čihař 22 August 2018 в 12:06
поделиться
  • 1
    / usr / bin / time --output имя_файла ls – chub 9 March 2010 в 13:39
  • 2
    Встроенное время хорошо работает с перенаправлением вывода. Он выводится только на STDERR, а не на STDOUT. – Mnementh 9 March 2010 в 14:09
  • 3
    Проблема в том, что встроенные команды выполняются в самой оболочке, а не в подоболочке. Поскольку stderr вашей оболочки обычно подключается к терминалу, перенаправление ничего не сделает. Чтобы перенаправить встроенное время, я считаю, что вам нужно будет сделать что-то вроде bash time mycmd 2>file. Или просто позвоните /usr/bin/time, как было упомянуто. – ktbiz 17 August 2017 в 02:36
  • 4
    Вы также можете использовать не встроенный без указания полного пути: stackoverflow.com/questions/29540540/… – Ciro Santilli 新疆改造中心 六四事件 法轮功 4 April 2018 в 22:44

Время команды отправляет его в STDERR (вместо STDOUT). Это потому, что команда, выполняемая со временем, обычно (в этом случае ls) выводит на STDOUT.

Если вы хотите записать выходные данные времени, введите:

(time ls) 2> filename

, который захватывает только выход времени, но вывод ls идет нормально к консоли. Если вы хотите записать оба в одном файле, введите:

(time ls) &> filename

2> перенаправляет STDERR, & amp;> перенаправляет оба.

20
ответ дан Mnementh 22 August 2018 в 12:06
поделиться
  • 1
    Этот ответ на самом деле отвечает why перенаправление OP не работает, что было одним из вопросов, заданных OP. Никто еще не обращается к этому. – Joshua 1 June 2016 в 14:27

Причина, по которой перенаправление не работает с time, заключается в том, что это зарезервированное слово bash (а не встроенное!) при использовании перед конвейером. bash (1):

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

Итак, для перенаправления вывода из time либо используйте фигурные скобки:

{ time ls; } 2> filename

Или вызов /usr/bin/time:

/usr/bin/time ls 2> filename
1
ответ дан user1338062 22 August 2018 в 12:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: