while read -r things; do
printf "%s\n" "$things"
done Если вы обнаружите, что пишете для i в $ (cat ...
, то остановитесь и измените это на при чтении -ri
вместо этого и введите данные в done
. Нет причин перебирать содержимое всего файла только для того, чтобы зацикливаться на нем, а в некоторых контекстах (большие данные), которые могут привести к большим неприятностям.
-r Флаг
для чтения
заставит read
правильно обрабатывать обратную косую черту.
Я также использую printf
вместо echo
. Почему? См. Здесь .
Я также цитирую свои переменные. Почему? См. Здесь .
Использование дочернего процесса задается где-то в системных вызовах wait3
или wait4
через указатель struct rusage
( wait4 (2)
). В источниках bash мы находим:
$ egrep -r 'wait[34][[:blank:]]*\(' .
./jobs.c: wait3 ((union wait *)statusp, options, (struct rusage *)0)
./jobs.c: wait3 (statusp, options, (struct rusage *)0)
./jobs.c: wait3 (statusp, options, (int *)0)
$
Пустой (struct rusage *) 0
указывает, что использование ресурсов не будет возвращено в bash
. Поиск struct rusage
действительно вызывает функцию time_command
в execute_cmd.c
, и это, похоже, собирает информацию об использовании через getrusage (2)
. Однако это относится к TIMEFORMAT
встроенной функции time
и, похоже, не пересекается с кодом истории. Без исправления bash
, я полагаю, вам нужно было бы выполнить какой-то клудж, связанный с запуском всего за время
, а затем фиксировать стандартную ошибку, когда информация о времени появляется в каком-то файле?
Определив HISTTIMEFORMAT в сценариях запуска, вы добавите метку времени к каждой строке файла истории bash. Значение этой переменной - это способ (*) печати временных меток на экране. Вот мой:
HISTTIMEFORMAT='%F-%T '
(*) См. man 3 strftime
(если у вас его нет, man date
должно помочь)