Я запускаю программу многократного использования скрипта bash и хочу, чтобы ее вывод записывался в файл. Тем не менее, я не мог заставить оператор "> filename.txt" работать ... Вот мой сценарий:
for i in {1..10000000..10000}
do
time ./merge $i>nn
done
кто-нибудь может мне помочь?
Обновление:
Ответ:
{ time ./merge $i ; } 2>> time.txt
Вы перезаписываете файл в каждом повторении цикла. Или, перенаправьте целый цикл в файл
for i in {1..10000000..10000}
do
time ./merge $i
done > nn
, или, использование добавляет:
for i in {1..10000000..10000}
do
time ./merge $i >> nn
done
time
немного забавно. Это - Bash, встроенный так первая вещь, которую необходимо сделать, ограничить его правильной командой. Можно сделать это путем группировки его с фигурными скобками или подокружения с круглой скобкой.
Затем необходимо отметить, что это производит к STDERR
. Это не будет перенаправлено по умолчанию, но мы можем зафиксировать это путем перенаправления STDERR
в STDOUT
и затем перенаправления этого.
Наконец (как choroba определенный передо мной) использование >
перезапишет по умолчанию. Выполнение его в цикле приведет только к последнему итеративному показу в файле. Вы хотите >>
, который добавит.
{ time ./merge $i ; } >> nn 2>&1
, Если Вы не хотите оригинала STDOUT
и просто хотите вывод времени, Вы могли выполнить это вместо этого:
{ time ./merge $i >/dev/null 2>&1; } 2>> nn
Это выбрасывает весь вывод эти ./merge
команда и просто перенаправляет STDERR
от более широкого блока.
Так же, как тестовая обвязка для показа этой работы:
$ for i in {1..10}; do { time echo $i >/dev/null 2>&1; } 2>> nn ; done
$ wc -l nn
40 nn
Это 10Г — блоки времени с 4 строками (вывод эха подавлен).
time
печать его результаты к standar ошибке, не стандартный вывод. Поэтому необходимо перенаправить первого с 2>
вместо последнего с >
. Ваш следующий выпуск - то, что Вы получаете вывод ./merge
а не time
. Так, необходимо сгруппировать time
и ./merge
команды и затем перенаправить их вывод. Это может быть сделано или путем выполнения их в отдельной подоболочке или путем группировки их в текущей оболочке:
Выполнение в отдельной подоболочке
for i in {1..10000000..10000}
do
( time ./merge $i ) 2>> nn
done
Выполнение в той же оболочке
for i in {1..10000000..10000}
do
{ time ./merge $i; } 2>> nn
done
В данном случае, нет никакого практического различия между двумя подходами.
Удар внутреннее время не является тем же как/usr/bin/time. Последний позволит Вам добавлять в файл:
/usr/bin/time --append --outout=outputfile command