Utilizo un alias simple para habilitar el "seguimiento" de comandos en una o varias ventanas de terminal:
alias trackmi='export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"'
Luego solo tengo tail -f
mi archivo .bash_history en otra terminal en el espacio de trabajo para obtener comentarios inmediatos. Acabo de habilitar el historial ilimitado y actualicé mi formato de historial ( export HISTTIMEFORMAT="[%F %T] "
) en .bashrc . Por supuesto, el history
comando muestra las marcas de tiempo. Pero el formato del archivo de historial per se es:
#1401234303
alias
#1401234486
cat ../.bashrc
¿Cómo puedo convertir el tiempo de Unix y mostrar todo el comando en una sola línea al igual que con el history
comando, incluida la numeración:
578 [2014-05-27 19:45:03] alias
579 [2014-05-27 19:48:06] cat ../.bashrc
... y sigue eso. ¿O encuentra una manera de emitir continuamente la salida del history
comando al terminal?
bash
text-processing
command-history
date
Comunidad
fuente
fuente
fn+1
para comparar. ¡Gracias!Aquí está el producto final en acción en un xterm de pantalla dividida, desde los valores predeterminados de shell hasta el trabajo en solo un par de comandos:
Una forma más dura de hacer esto que la que se muestra en la captura de pantalla podría verse así:
¿Dónde
${TGT_PTY}
estaría lo que obtiene deltty
comando cuando realmente ejecuta un shell interactivo en la pantalla donde desea su salida? O, realmente, podría usar cualquier archivo que se pueda escribir, ya que esencialmente es solo un objetivo para la redirección de archivos.Utilizo la sintaxis pty para pseudo-terminal porque supongo que es un xterm de algún tipo, pero podría dedicar un vt con la misma facilidad, y su historial transmitido siempre está a solo una
CTRL-ALT-Fn
combinación de teclas. Si fuera yo podría combinar las dos nociones y convertirla en unascreen
otmux
sesión en un vt dedicada ... Pero estoy divagando.En una máquina recién iniciada, recibo el típico
/bin/login
aviso en unagetty
consola típica de Linux . PresionoCTRL-ALT-F2
para acceder a unakmscon
consola menos típica que se comporta mucho más como unxterm
que atty
. Entro en el comandotty
y recibo en respuesta/dev/pts/0
.En general, xterms multiplexa un dispositivo de terminal único en múltiples usando pseudo terminales , por lo que si hiciera algo similar en X11 al cambiar entre pestañas de terminal o ventanas, probablemente también recibiría la salida
/dev/pts/[0-9]*
. Pero las consolas de terminal virtual a las que se accede conCTRL-ALT-Fn
combinaciones de teclas son dispositivos de terminal verdaderos (er) y, por lo tanto, reciben su propia/dev/tty[0-9]*
designación.Es por eso que después de iniciar sesión en la consola 2 cuando escribo
tty
en el indicador, la respuesta es/dev/pts/0
pero cuando hago lo mismo en la consola 1, la salida es/dev/tty1
. En cualquier caso, de vuelta en la consola 2, entonces hago:No hay efecto discernible. Continúo escribiendo algunos comandos más y luego cambio a la consola 1 presionando
CTRL-ALT-F1
nuevamente. Y allí encuentro entradas repetidas que se parecen<date_time>\n<hist#>\t<hist_cmd_string>
a cada comando que escribí en la consola 2.Sin embargo, salvo escribir directamente en un dispositivo terminal, otra opción podría ser algo como:
Y entonces tal vez ...
El comando de solicitud aproximada no cumple con sus especificaciones, sin cadenas de
date
formato ni opciones de formato parafc
ninguna de ellas, pero su mecanismo no requiere mucho: cada vez que su solicitud representa el último comando del historial y la fecha y hora actuales se escriben en El${TGT_PTY}
archivo que especifique. Es tan simple como eso.Mirar e imprimir el historial de shell es
fc
el propósito principal. Es un shell incorporado, incluso sidate
no lo es. Enzsh
fc
puede proporcionar todo tipo de opciones de formato sofisticadas, varias de las cuales se aplican a las marcas de tiempo. Y, por supuesto, como observas más arriba,bash
los shistory
pueden hacer lo mismo.En aras de una salida más limpia, puede usar una técnica que he explicado mejor aquí para establecer una variable de seguimiento persistente en el shell actual a pesar de tener que rastrearlo y procesarlo en subcapas dentro de la secuencia de solicitud.
Aquí hay un medio portátil de formatear según sus especificaciones:
Implemento el contador last_history
$_LH
que solo rastrea las últimas actualizaciones para que no escriba el mismo comando de historial dos veces, por ejemplo, solo por presionar enter. Hay un poco de discusión necesaria para que la variable se incremente en el shell actual para que conserve su valor a pesar de que la función se llama en un subshell, que, una vez más, se explica mejor en el enlace .Su salida se ve como
<hist#>\t[%F %T]\t<hist_cmd>\n
Pero esa es solo la versión totalmente portátil. Con
bash
esto se puede hacer con menos y mediante la implementación solo de los componentes integrados de shell, lo que probablemente sea deseable cuando se considera que este es un comando que se ejecutará cada vez que presione[ENTER]
. Aquí hay dos formas:Alternativamente, utilizando
bash
elhistory
comando 's , puede definir la_HIST
función de esta manera:La salida para cualquiera de los métodos también se ve así:
<hist#>\t[%F %T]\t<hist_cmd>\n
aunque elhistory
método incluye algunos espacios en blanco iniciales. Aún así, creo que lashistory
marcas de tiempo del método serán más precisas ya que no creo que tengan que esperar a que se complete el comando referenciado antes de adquirir su sello.Puede evitar el seguimiento de cualquier estado en ambos casos si solo de alguna manera filtra la transmisión
uniq
, como podría hacer conmkfifo
lo que mencioné antes.Pero hacerlo en el indicador de esta manera significa que siempre se actualiza solo tan pronto como sea necesario por la simple acción de actualizar el indicador. Es simple.
También puede hacer algo similar a lo que está haciendo,
tail
pero más bien establecerfuente
${TGT_PTY}
y todo? Si es así, explicaría la 'redirección ambigua' porque sería una variable vacía. Necesitas un archivo./dev/pts/[num]
con toda probabilidad -cat
si estaba paranoico. Funciona bien, incluso 12 horas después.Siéntase libre de jugar con el formato, pero esto (creo) hace lo que está pidiendo ... guardar en algún lugar de su RUTA, hacer ejecutable y disfrutar:
Estoy seguro de que se puede optimizar, pero se entiende la idea.
Breve explicación: como ~ / .bash_history no realiza un seguimiento del recuento, primero determinamos el número de entradas. Luego, un poco de magia awk para obtener el formato correcto y realizar un seguimiento de la cantidad de entradas.
fuente
tail -f
leerá 10 líneas inicialmente que ya se han incluido en sucount
. Asume una fecha GNU en un entorno que no es POSIX (POSIXLY_CORRECT no establecido). Ejecuta un comando de shell y un comando de fecha por marca de tiempo.count
cuenta la mitad de la línea.bash_history
y luego se incrementa para cada línea que no comienza#
, por lo que es probable que el conteo del historial informado sea incorrecto. El usocount=$(grep -c '^#' ...)
probablemente sería mejor, pero en cualquier caso, es probable que esos números del historial terminen desincronizados, especialmente si tiene más de 2 bash ejecutándose al mismo tiempo.history
aprovecha el comando.