bash скрипт записи времени выполнения в файл
мне нужно записать время, необходимое для выполнения этой команды в txt-файле:
time ./program.exe
Как я могу сделать в bash-скрипт?
Я пытаюсь с >> time.txt
но это не работает (вывод не переходит в файл и переходит на экран).
4 ответов
начало time
на bash
записать в файл-это тяжелая работа. Это bash
встроенная команда. (В Mac OS X есть внешняя команда /usr/bin/time
, который выполняет аналогичную работу, но с другим форматом вывода и меньшим сопротивлением.)
вам нужно использовать:
(time ./program.exe) 2> time.txt
он записывает в стандартную ошибку (следовательно,2>
нотации). Однако, если вы не используете под-оболочку (круглые скобки), она не работает; выходные данные по-прежнему поступают в экран.
альтернативно, и без под-оболочки, вы можете использовать:
{ time ./program.exe; } 2> time.txt
обратите внимание на пробел после открытой скобки и двоеточия; оба необходимы на одной строке. Фигурные скобки должны отображаться там, где может появиться команда, и должны быть автономными символами. (Если вы будете бороться достаточно сильно, вы придумаете ...;}|something
или ...;}2>&1
. Однако оба они идентифицируют скобку как отдельный символ. Если вы попробуете ...;}xyz
оболочка (наверное) не найдите команду }xyz
, хотя.)
мне нужно запустить команду в терминале. Если я это сделаю:
xterm -xrm '*hold: true' -e (time ./Program.exe) >> time.exe & sleep 2
он не работает и говорит мне
Syntax error: "(" unexpected
. Как это исправить?
вам нужно будет сделать что-то вроде:
xterm -xrm '*hold: true' -e sh -c "(time ./Program.exe) 2> time.txt & sleep 2"
изменение ключа заключается в запуске оболочки со скриптом, исходящим из аргумента в ; вы можете заменить sh
С /bin/bash
или эквивалент имени. Это должно обойти любые проблемы "синтаксической ошибки". Я не совсем уверен, что вызывает эту ошибку, поэтому может быть более простой и лучший способ справиться с ней. Также возможно, что xterm
' s -e
опция принимает только один строковый аргумент, и в этом случае, я полагаю, вы бы использовали:
xterm -xrm '*hold: true' -e 'sh -c "(time ./Program.exe) 2> time.txt & sleep 2"'
вы можете руководство bash xterm
насколько я могу.
я не уверен, почему вы запустите приурочен программы в фоновом режиме, но это ваша проблема, а не моя. Аналогично, the sleep 2
не очевидно необходимо, если hold: true
держит открытым контактом.
это не легко перенаправить выход bash builtin time
.
одним из решений является использование внешнего time
программа:
/bin/time --append -o time.txt ./program.exe
(в большинстве систем это программа GNU, поэтому используйте info time
, а не man
получить документацию).
time_elapsed=(time sh -c "./program.exe") 2>&1 | grep "real" | awk '{print $(NF)}'
echo time_elapsed > файл.формат txt
Эта команда должна дать вам точное время, затраченное в bash в нужном файле..
вы также можете перенаправить это в файл usng 2 > file.txt, как описано в другом ответе.
просто заключите команду на время в { .. }
:
{ time ./program.exe; } 2>&1
конечно, выход встроенного времени идет на stderr, таким образом, необходимое перенаправление 2>&1
.
тогда может показаться сложным захватить вывод, давайте использовать второй { .. }
чтобы легче прочитать команду, это работает:
{ { time ./program.exe; } 2>&1; } >> time.txt # This works.
однако правильная конструкция должна просто иметь обратный захват, как это:
{ time ./program.exe; } >> time.txt 2>&1; # Correct.
закрыть любой возможный выход из команда, перенаправить ее вывод в /dev/null, как это:
{ time ./program.exe >/dev/null 2>&1; } >> time.txt 2>&1 # Better.
и, поскольку теперь есть только выход на stderr, мы могли бы просто захватить его:
{ time ./program.exe >/dev/null 2>&1; } 2>> time.txt # Best.
выход из ./ программа должна быть перенаправлена, или она может закончиться внутри времени.формат txt.