Также я вижу здесь много хороших и объяснительных ответов, поэтому хочу изложить свою точку зрения здесь, в том числе дополнительную информацию, которую я заметил при использовании этого метода.
Тестирование модуля
За последние два года я написал проект хобби, и я не писал для него модульные тесты. После того, как я написал около 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).
вы можете перенаправить вывод времени с помощью
(time ls) &> file
Поскольку вам нужно взять (время ls) как одну команду, чтобы вы могли использовать фигурные скобки.
Если вы не хотите смешивать вывод с time
и командой. С GNU-временем вы можете использовать -o file
, например:
/usr/bin/time -o tim grep -e k /tmp 1>out 2>err
, а tim
- время, out
и err
- stdout и stderr из grep
.
нет необходимости запускать подклассу. Использовать кодовый блок также будет.
{ time ls; } 2> out.txt
или
{ time ls > /dev/null 2>&1 ; } 2> out.txt
время - это встроенная оболочка, и я не уверен, есть ли способ перенаправить ее. Однако вместо этого вы можете использовать /usr/bin/time
, которые определенно согласуются с любыми перенаправлением вывода.
bash time mycmd 2>file
. Или просто позвоните /usr/bin/time
, как было упомянуто.
– ktbiz
17 August 2017 в 02:36
Время команды отправляет его в STDERR (вместо STDOUT). Это потому, что команда, выполняемая со временем, обычно (в этом случае ls) выводит на STDOUT.
Если вы хотите записать выходные данные времени, введите:
(time ls) 2> filename
, который захватывает только выход времени, но вывод ls идет нормально к консоли. Если вы хотите записать оба в одном файле, введите:
(time ls) &> filename
2> перенаправляет STDERR, & amp;> перенаправляет оба.
Причина, по которой перенаправление не работает с time
, заключается в том, что это зарезервированное слово bash (а не встроенное!) при использовании перед конвейером. bash (1):
Если зарезервированное слово времени предшествует конвейеру, то истекшее, а также время пользователя и системы, затраченное на его выполнение, сообщаются, когда конвейер завершается.
blockquote>Итак, для перенаправления вывода из
time
либо используйте фигурные скобки:{ time ls; } 2> filename
Или вызов
/usr/bin/time
:/usr/bin/time ls 2> filename
&>
, пожалуйста, где я могу узнать об этом? – hello_there_andy 21 February 2017 в 00:47&>file
аналогичен>file 2>&1
. Он направляет как stdout, так и stderr. – ktbiz 17 August 2017 в 02:21