Я использую простой псевдоним, чтобы включить «отслеживание» команд в одном или нескольких терминальных окнах:
alias trackmi='export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"'
Затем я просто помещаюtail -f
свой файл .bash_history в другой терминал рабочей области, чтобы получить немедленную обратную связь. Я только что включил неограниченную историю и обновил свой формат истории ( export HISTTIMEFORMAT="[%F %T] "
) в .bashrc . Конечно, history
команда отображает метки времени. Но формат файла истории сам по себе:
#1401234303
alias
#1401234486
cat ../.bashrc
Как мне преобразовать время Unix и вывести всю команду в одну строку, как с history
командой, включая нумерацию:
578 [2014-05-27 19:45:03] alias
579 [2014-05-27 19:48:06] cat ../.bashrc
... и следуй за этим. Или найти способ постоянно выводить вывод history
команды на терминал?
bash
text-processing
command-history
date
Сообщество
источник
источник
fn+1
чтобы сравнить! Спасибо!Вот конечный продукт в действии на xterm с разделенным экраном, по умолчанию оболочка по умолчанию работает всего за пару команд:
Более грубый способ сделать это, чем показано на скриншоте, может выглядеть так:
Где
${TGT_PTY}
бы вы ни находились вtty
команде, когда запускаете интерактивную оболочку на экране, где вы хотите получить вывод. Или, на самом деле, вы можете использовать любой доступный для записи файл, так как он по сути является целью перенаправления файлов.Я использую синтаксис pty для псевдотерминала, потому что я предполагаю, что это какой-то xterm, но вы могли бы так же легко выделить vt - и ваша потоковая история всегда является лишь
CTRL-ALT-Fn
ключевой комбинацией. Если бы это был я, я мог бы объединить два понятия и сделать это сеансомscreen
илиtmux
сеансом на выделенном виртуальном пути ... Но я отвлекся.На недавно загруженной машине меня приветствует типичная
/bin/login
подсказка на типичнойgetty
консоли Linux . Я нажимаю,CTRL-ALT-F2
чтобы получить доступ к менее типичнойkmscon
консоли, которая ведет себя намного больше,xterm
чем atty
. Я ввожу командуtty
и получаю в ответ/dev/pts/0
.Как правило, xterms мультиплексирует одно оконечное устройство на несколько, используя псевдотерминалы - поэтому, если бы вы делали подобное в X11, переключаясь между вкладками клемм или окнами, вы, вероятно, также получили бы вывод
/dev/pts/[0-9]*
. Но виртуальные терминальные консоли, к которымCTRL-ALT-Fn
получают доступ с помощью комбинаций клавиш, являются истинными (эр) терминальными устройствами и поэтому получают свое собственное/dev/tty[0-9]*
обозначение.Вот почему после входа в консоль 2, когда я печатаю
tty
в командной строке, ответ,/dev/pts/0
но когда я делаю то же самое в консоли 1, вывод/dev/tty1
. В любом случае обратно на консоль 2 я потом делаю:Там нет заметного эффекта. Я продолжаю набирать еще несколько команд, а затем переключаюсь на консоль 1,
CTRL-ALT-F1
снова нажимая . И там я нахожу повторяющиеся записи, которые похожи<date_time>\n<hist#>\t<hist_cmd_string>
на каждую команду, которую я набрал на консоли 2.Если запретить прямую запись на терминальное устройство, другой вариант может выглядеть примерно так:
И тогда, может быть ...
Команда грубого приглашения не соответствует вашим спецификациям - для нее нет ни строки
date
форматирования, ни параметров форматированияfc
- но ее механизм не требует много: каждый раз, когда ваш запрос отображает последнюю команду истории, а текущая дата и время записываются в${TGT_PTY}
файл , который вы укажете. Это так просто.Просмотр и распечатка истории оболочки является
fc
основной целью. Это встроенная оболочка, даже еслиdate
нет. Онzsh
fc
может предоставить все возможные варианты форматирования, некоторые из которых применяются к временным меткам. И, конечно же , как Вы отмечаете выше,bash
«shistory
может сделать то же самое.В целях более чистого вывода вы можете использовать метод, который я лучше объяснил здесь, чтобы установить постоянную переменную отслеживания в текущей оболочке, несмотря на необходимость отслеживать ее и обрабатывать ее в подоболочках в последовательности подсказок.
Вот портативное средство форматирования в соответствии с вашими требованиями:
Я реализую счетчик last_history,
$_LH
который просто отслеживает последние обновления, чтобы вы не выписывали одну и ту же команду истории дважды - например, только для нажатия клавиши enter. Необходимо немного поспорить, чтобы увеличить переменную в текущей оболочке, чтобы она сохраняла свое значение, даже если функция вызывается в подоболочке - что, опять же, лучше объяснено в ссылке .Его вывод выглядит как
<hist#>\t[%F %T]\t<hist_cmd>\n
Но это только полностью портативная версия. С
bash
этим можно справиться с меньшими затратами и реализовать только встроенные функции оболочки - что, вероятно, желательно, если учесть, что эта команда будет запускаться при каждом нажатии[ENTER]
. Вот два способа:Кроме того, используя команду
bash
'shistory
, вы можете определить_HIST
функцию следующим образом:Вывод для любого метода также выглядит следующим образом:
<hist#>\t[%F %T]\t<hist_cmd>\n
хотяhistory
метод включает в себя несколько ведущих пробелов. Тем не менее, я полагаю, чтоhistory
временные метки метода будут более точными, так как я не думаю, что им нужно будет ждать завершения указанной команды, прежде чем получить их штамп.Вы можете избежать отслеживания любого состояния в обоих случаях, если только вы каким-то образом фильтруете поток
uniq
- как вы могли бы сделать,mkfifo
как я упоминал ранее.Но выполнение этого в приглашении, как это, означает, что оно всегда обновляется только тогда, когда это необходимо, простым действием обновления приглашения. Это просто.
Вы также можете сделать что-то похожее на то, что вы делаете,
tail
но скорее установитьисточник
${TGT_PTY}
и все? Если это так, это объясняет «неоднозначное перенаправление», потому что это будет пустая переменная. Вам нужен файл./dev/pts/[num]
по всей вероятности , -cat
я был параноиком. Работает нормально - даже через 12 часов.Не стесняйтесь играть с форматированием, но это (я полагаю) делает то, что вы просите ... сохранить где-нибудь в вашем PATH, сделать исполняемым и наслаждаться:
Я уверен, что это можно оптимизировать, но вы поняли идею.
Краткое объяснение: поскольку ~ / .bash_history не отслеживает количество, мы сначала определяем количество записей. Затем немного волшебства awk, чтобы получить правильное форматирование и отслеживать количество записей.
источник
tail -f
будет читать 10 строк изначально, которые уже были включены в вашcount
. Предполагается дата GNU в среде, отличной от POSIX (POSIXLY_CORRECT не установлена). Он запускает одну команду оболочки и одну команду даты на отметку времени.count
рассчитывает половину строки.bash_history
, а затем увеличивается для каждой строки, не начинающейся с#
, так что сообщаемый счетчик истории, вероятно, будет неправильным. Использованиеcount=$(grep -c '^#' ...)
, вероятно, было бы лучше, но в любом случае эти номера истории, скорее всего, не синхронизируются, особенно если у вас одновременно запущено более двух bash.history
командой.