bash - usuario - linux history command
Bash: ¿Cómo obtengo el historial de comandos en una sesión de pantalla? (7)
Cuando exit
un terminal (o shell) el shell escribe su historial en $ HISTFILE, por lo que para obtener su historial en otro terminal puede escribir exit
en el terminal del que quiere el historial y se escribirá.
cat $HISTFILE
#or tac, less, $EDITOR, ... depending on how you want to "access" it
Si comienzo una sesión de screen -dmS name
con la screen -dmS name
, ¿cómo accedería al historial de comandos de esa sesión de pantalla con un script?
Usando ↑ , aparece el último comando ejecutado, incluso en la pantalla.
screen
no mantiene un historial de los comandos que escribe. Tu caparazón puede o no mantener un historial. Como bash
usar bash
, puedes usar el comando history
.
screen
parece tener una aproximación bruta de una búsqueda de historial (simplemente busca en el búfer de desplazamiento una línea de comando. Consulte la página man de la screen
bajo el comando "historial" (enlazado a Ca {
de forma predeterminada).
@technosaurus tiene razón. $ HISTFILE se escribe cuando bash sale, por lo que puede salir de una sesión bash e iniciar una nueva, y la historia debería haberse conservado a través del archivo.
Pero creo que hay una mejor manera de resolver tu problema. El manual de bash incluye una descripción del comando de historia incorporado . Le permite guardar este historial con history -w [filename]
y leer el historial con history -r [filename]
. Si no proporciona un nombre de archivo, usará $ HISTFILE.
Por lo tanto, propondría que guarde el historial dentro de su sesión de pantalla en un archivo específico (o en su $ HISTFILE predeterminado, si lo desea). Luego, lea el archivo de historial en la otra sesión de bash desde la que desea acceder al historial. De esta forma, no tiene que salir de la sesión de bash original.
history
mostrará todo el comando de historia.
use esto: pantalla -L con mayúscula L guardará una copia de la entrada y salida del terminal en un archivo llamado screenlog.0 o si usa -S para nombrarlo, el archivo de registro obtiene el nombre de pantalla
Uso el shell bash predeterminado en mi sistema y es posible que no funcione con otros shells.
esto es lo que tengo en mi archivo ~/.screenrc
para que cada nueva ventana de pantalla tenga su propio historial de comandos:
Pantalla predeterminada Windows con historial de comando propio
Para abrir un conjunto de ventanas de pantalla predeterminadas, cada una con su propio archivo de historial de comandos, puede agregar lo siguiente al archivo ~/.screenrc
:
screen -t "window 0" 0 bash -ic ''HISTFILE=~/.bash_history.${WINDOW} bash''
screen -t "window 1" 1 bash -ic ''HISTFILE=~/.bash_history.${WINDOW} bash''
screen -t "window 2" bash -ic ''HISTFILE=~/.bash_history.${WINDOW} bash''
Asegúrese de que Windows nuevo obtenga su propio historial de comandos
La configuración de pantalla predeterminada significa que crea una nueva ventana usando Ctrl+ac
o Ctrl+a Ctrl+c
. Sin embargo, con lo anterior en su archivo ~/.screenrc
, estos usarán el archivo predeterminado ~/.bash_history
. Para solucionar esto, sobrescribiremos los enlaces de teclas para crear ventanas nuevas. Agregue esto a su archivo ~/.screenrc
:
bind c screen bash -ic ''HISTFILE=~/.bash_history.${WINDOW} bash''
bind ^C screen bash -ic ''HISTFILE=~/.bash_history.${WINDOW} bash''
Ahora cada vez que creas una nueva ventana de pantalla, en realidad está lanzando un shell bash, estableciendo la variable de entorno HISTFILE
a algo que incluye el número de ventana de la pantalla actual ( $WINDOW
).
Los archivos del historial de comandos se compartirán entre sesiones de pantalla con los mismos números de ventana.
Escribir comandos en $HISTFILE
en ejecución
Como es el comportamiento normal de bash, el historial solo se escribe en el archivo $HISTFILE
al salir de la ventana del shell / pantalla. Sin embargo, si desea que los comandos se escriban en los archivos de historial después de que se ejecute el comando, y por lo tanto disponibles inmediatamente para otras sesiones de pantalla con el mismo número de ventana, puede agregar algo como esto a su archivo ~/.bashrc
:
export PROMPT_COMMAND="history -a; history -c; history -r; ${PROMPT_COMMAND}"
Puse las siguientes líneas en mi .bashrc:
case "$TERM" in
screen)
declare SCREEN_NAME=$(echo $STY | sed -nr ''s/[^.]*/.(.*)//1/p'')
if [[ $SCREEN_NAME ]]; then
HISTFILE="${HISTFILE}.${SCREEN_NAME}.${WINDOW}"
declare -p HISTFILE
fi
unset SCREEN_NAME
;;
*)
;;
esac
Mi .bashrc predeterminado tiene este ''caso'' básicamente con el valor ''xterm * | rxvt *)'', así que solo agregué mi parte de ''pantalla''. Si no tiene este ''caso'', puede usar el siguiente en lugar de este:
if [[ $TERM == screen ]]; then
declare SCREEN_NAME=$(echo $STY | sed -nr ''s/[^.]*/.(.*)//1/p'')
if [[ $SCREEN_NAME ]]; then
HISTFILE="${HISTFILE}.${SCREEN_NAME}.${WINDOW}"
declare -p HISTFILE
fi
unset SCREEN_NAME
fi
Y después tengo un propio bash_history para todas las ventanas de mi pantalla completa .
Nota: ¡esto no funciona en chroot!