Использование дочернего процесса задается где-то в системных вызовах 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
, я полагаю, вам нужно было бы выполнить какой-то клудж, связанный с запуском всего за время
, а затем фиксировать стандартную ошибку, когда информация о времени появляется в каком-то файле?
]
Во-первых, кто
не заботится о оболочках входа в систему или чем-то подобном. Он просто выводит записи utmp
. Вы можете иметь запись для терминалов без входа в систему; для графических сессий; для FTP-соединений (с полностью выдуманным именем «линии» tty); на что угодно.
Во-вторых, записи utmp создаются вручную— вы получаете запись только в том случае, если программа, которая обрабатывает ваш логин, вызывает pututline(…)
. Например, sshd делает это всегда, эмуляторы терминала частоделают это (но не всегда), а su
никогда.
(Помните, что su
не выделяет новый pty, поэтому он также не может добавить запись utmp — в противном случае вы получите несколько записей для одного и того же tty, что может запутать несколько программы.)