BASH: записать вывод команды в файл

Я запускаю программу многократного использования скрипта bash и хочу, чтобы ее вывод записывался в файл. Тем не менее, я не мог заставить оператор "> filename.txt" работать ... Вот мой сценарий:

for i in {1..10000000..10000}
do
    time ./merge $i>nn
done

кто-нибудь может мне помочь?

Обновление:

Ответ:

{ time ./merge $i ; } 2>> time.txt
1
задан 2 February 2017 в 11:01

4 ответа

Вы перезаписываете файл в каждом повторении цикла. Или, перенаправьте целый цикл в файл

for i in {1..10000000..10000}
do
    time ./merge $i
done > nn

, или, использование добавляет:

for i in {1..10000000..10000}
do
    time ./merge $i >> nn
done
1
ответ дан 2 February 2017 в 11:01

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 строками (вывод эха подавлен).

3
ответ дан 2 February 2017 в 11:01

time печать его результаты к standar ошибке, не стандартный вывод. Поэтому необходимо перенаправить первого с 2> вместо последнего с >. Ваш следующий выпуск - то, что Вы получаете вывод ./merge а не time. Так, необходимо сгруппировать time и ./merge команды и затем перенаправить их вывод. Это может быть сделано или путем выполнения их в отдельной подоболочке или путем группировки их в текущей оболочке:

  1. Выполнение в отдельной подоболочке

    for i in {1..10000000..10000}
    do
      ( time ./merge $i ) 2>> nn
    done
    
  2. Выполнение в той же оболочке

    for i in {1..10000000..10000}
    do
      { time ./merge $i; } 2>> nn
    done
    

В данном случае, нет никакого практического различия между двумя подходами.

1
ответ дан 2 February 2017 в 11:01

Удар внутреннее время не является тем же как/usr/bin/time. Последний позволит Вам добавлять в файл:

/usr/bin/time --append --outout=outputfile command
1
ответ дан 2 February 2017 в 11:01

Другие вопросы по тегам:

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