Как иметь историю команд с выводом меток времени к терминалу непрерывно?

Для удобства. Это позволяет многочисленным пользователям войти в систему на консоли (например, у Вас может быть консоль, работающая как корень и один как некорневая). Это позволяет Вам запустить X сессий на одной и иметь другого с сессией текстового режима и все же другого с приложением SVGA. Кроме SVGA, который не действительно релевантен в наше время, имея X или экран, делает несколько консолей главным образом избыточными. Но так как стоимость является крошечной, и это иногда полезно, большинство дистрибутивов все еще имеет его как функцию по умолчанию.

8
13.04.2017, 15:36
3 ответа
[1184256] В GNU [1184666] awk[1184667]:[12105]
6
27.01.2020, 20:10
[1184210] Не стесняйтесь играть с форматированием, но это (я верю) делает то, о чем вы просите ... сохраните где-нибудь в вашем PATH, сделайте его исполняемым и наслаждайтесь:

Я уверен, что его можно оптимизировать, но вы поняли идею.

enter image description here

Краткое объяснение: так как ~/.bash_history не отслеживает количество записей, мы сначала определяем количество записей. Затем немного магии awk, чтобы правильно отформатировать и отследить количество записей.[1184215]

4
27.01.2020, 20:10
[1186361]Вот конечный продукт в действии на разделенном экране, который, по сути, переходит от оболочки по умолчанию к работе всего лишь парой команд:[12163]Более грубый способ сделать это, чем демонстрируется на скриншоте, может выглядеть следующим образом: [12164]Где [1186810]${TGT_PTY}[1186811] будет все, что вы получите из команды [1186812]tty[1186813], когда на самом деле запустите интерактивную оболочку на экране, где вам нужен вывод. Или, на самом деле, вы можете использовать любой записываемый файл вообще, так как это, по сути, просто цель для перенаправления файлов.[12165] Я использую синтаксис [1186814]pty[1186815] для [1186816]псевдотерминала [1186817], потому что я предполагаю, что это какой-то xterm, но вы можете с таким же успехом выделить vt - и ваша потоковая история всегда только [1186818]CTRL-ALT-Fn[1186819] комбинация клавиш. Если бы это был я, я мог бы объединить эти два понятия и сделать его [1186820] экран [1186821] или [1186822] tmux [1186823] сессии на специальном vt... Но я отступаю.[12166]На только что загруженной машине меня встречают с типичным сообщением [1186824]/in/login[1186825] на типичной Linux [1186826]getty[1186827] консоли. Я нажимаю [1186828]CTRL-ALT-F2[1186829], чтобы получить доступ к менее типичной консоли [1186830]kmscon[1186831], которая ведет себя гораздо больше как [1186832]xterm[1186833], чем [1186834]tty[1186835]. Вхожу в команду [1186836]tty[1186837] и получаю в ответ [1186838]/dev/pts/0[1186839].[12167]Обычно с помощью псевдотерминалов [1186840]xterms мультиплексирует одно клеммное устройство в несколько, используя [1186840]pseudo Terminals[1186841] - так что если бы вы делали подобное в X11, переключаясь между клеммными вкладками или окнами, то, скорее всего, получили бы выход также как [1186842]/dev/pts/[0-9]*[1186843]. Но виртуальные терминальные консоли, доступ к которым осуществляется с помощью комбинаций клавиш [1186844]CTRL-ALT-Fn[1186845], являются терминальными устройствами true(er) и поэтому получают собственное обозначение [1186846]/dev/tty[0-9]*[1186847]. Поэтому после входа в консоль 2, когда я набираю [1186848]tty[1186849] при запросе, ответ будет [1186850]/dev/pts/0[1186851], но когда я делаю то же самое на консоли 1, выход будет [1186852]/dev/tty1[1186853]. В любом случае, вернувшись на консоль 2, я сделаю:[12169]Нет никакого заметного эффекта. Я продолжаю печатать еще несколько команд, а затем переключаюсь на консоль 1, снова нажимая [1186854]CTRL-ALT-F1[1186855]. И там я нахожу повторяющиеся записи, которые выглядят как [1186856]\n\t[1186857] для каждой команды, которую я набирал на консоли 2.[12170]Запрещая прямую запись на терминальное устройство, другой вариант может выглядеть как:[12171]А потом, может быть..... [12172]Примерная команда prompt не соответствует вашим спецификациям - нет строки форматирования для [1186858]date[1186859] и опций форматирования для [1186860]fc[1186861] тоже - но ее механизм не требует многого: каждый раз, когда ваша подсказка выдает последнюю команду истории, текущая дата и время записывается в указанный вами файл [1186862]${TGT_PTY}[1186863]. Все просто.[12173]Смотреть и распечатывать историю оболочки - это основное назначение [1186864]fc[1186865]. Это встроенная оболочка, даже если дата [1186866]дата [1186867] нет. В [1186868]zsh[12174]fc[1186871] могут быть предоставлены все виды фантастических опций форматирования, некоторые из которых применимы к временным меткам. И, конечно же, как Вы отметили выше, [1186872]bash[1186873] [1186874]history[1186875] может сделать то же самое. [12175] В интересах более чистого выхода, вы можете использовать технику, которую я объяснил лучше [1186876] здесь [1186877], чтобы установить постоянную отслеживающую переменную в текущей оболочке, несмотря на необходимость отслеживать ее и обрабатывать в подоболочках в оперативной последовательности. [12176]Вот портативный способ форматирования в соответствии с вашими спецификациями:[12177]Я реализую счетчик [1186878]last_history[1186879] [1186880]$_LH[1186881], который просто отслеживает последние обновления, чтобы вы не записывали одну и ту же команду истории дважды - например, просто для нажатия клавиши enter. Нужно немного поспорить, чтобы увеличить переменную в текущей оболочке и сохранить ее значение, даже если функция вызывается в подоболочке, что опять же лучше объясняется в ссылке [1186882][1186883].[12178] Ее вывод выглядит как [1186884]\t[%F %T]\t\n[12179]Но это всего лишь полностью переносимая версия. С помощью [1186886]bash[1186887] это можно сделать с меньшими затратами и реализовать только сборки оболочки - что, вероятно, желательно, если учесть, что это команда, которая будет выполняться каждый раз, когда вы нажимаете [1186888][ENTER][1186889]. В качестве альтернативы, используя команду [1186890]bash[1186891] [1186892]history[1186893], можно определить функцию [1186894]_HIST[1186895] следующим образом:[12181]Вывод для любого из методов также выглядит так:[12181]Вывод для любого из методов также выглядит так: [1186896]\t[%F %T]\t\n[1186897], хотя метод [1186898]history[1186899] включает в себя некоторые ведущие пробелы. Тем не менее, я считаю, что временные метки метода [1186900]history[1186901] будут более точными, так как я не думаю, что им нужно будет ждать завершения команды, на которую делается ссылка, прежде чем они получат свою печать. [12182] В обоих случаях можно вообще избежать отслеживания любого состояния, если только как-то отфильтровать поток с помощью [1186902]uniq[1186903] - как это можно сделать с [1186904]mkfifo[1186905], как я уже говорил.[12183] Но делать это в такой строке запроса - значит, она всегда обновляется только тогда, когда это необходимо, простым действием по обновлению строки запроса. Все просто.[12184]Вы также можете сделать что-то похожее на то, что делаете с [1186906]tail[1186907], но вместо этого установите [12185]
5
27.01.2020, 20:10

Теги

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