Me parece que hago mucho trabajo en un proyecto en un directorio establecido. A veces, unos meses después, necesito rehacer algo en ese proyecto, pero no puedo recordar lo que hice. Uso mercurial o git para rastrear los cambios en los archivos, pero quiero poder recordar qué comandos emití en ese directorio.
Buscar en mi historial de shell no es muy informativo. Ya registro todo en mis archivos de historial. * _, Pero quiero una lista de las cosas que hice en ~ / foo / bar, y no todas las otras (millones) cosas que hice esa semana. Probablemente ni siquiera puedo recordar en qué mes trabajé por última vez en ese proyecto en particular.
¿Alguien tiene alguna idea de cómo un archivo de registro de directorio de proyecto de todos los comandos de shell que he usado? Estoy imaginando un comando algo como:
workon myproject
... que establecería el archivo de registro de shell en ~ / myproject / .history.log, cargaría el historial anterior de ese archivo de registro y quizás actualizaría mi mensaje para decirme en qué directorio estoy trabajando (como, por ejemplo, vcprompt para proporcionar la versión información de control).
¿Hay algo por ahí como este?

Puede que le interese un complemento que escribí llamado directorio-historial para zsh.
Mira aquí: https://github.com/tymm/directory-history
Aunque en realidad no se ajusta a su trabajo en el flujo de trabajo de myproject , debería adaptarse perfectamente a sus necesidades.
Crea una historia que incluye directorios.
Cuando busque en su historial, primero obtendrá los comandos del directorio en el que se encuentra.
Si no quedan comandos para ese directorio, recurrirá a un historial global y sugerirá los comandos utilizados en otros directorios.
fuente
Si desea algo simple, puede tener su
.history.logarchivo como tal:A continuación, ejecute el archivo con
catlos comandos que enumeró en él.También puede agrupar esos comandos en archivos separados por funcionalidad como convención:
Esto tiene la ventaja adicional de trabajar fuera de la caja y no contaminar su entorno.
fuente
README.mdo crear otros.mdarchivos por tema y señalarlos desde el archivo Léame. Eso si tiene una interfaz de control de fuente amigable de reducción.Para obtener un archivo de historial local para un directorio, agregué la siguiente línea a mi comando bash prompt.
if [ -f .local_history ] ; then tail -1 $HISTFILE >> .local_history ; fiEl comando
touch .local_historyen un directorio me da un archivo de historial local para todos los comandos ejecutados en ese directorio, sin perder el archivo de historial principal. Algo similar funcionaría en zsh, supongo.fuente
Al menos en bash, HISTFILE solo se consulta al inicio de la instancia de shell. La idea por directorio no funcionará aquí, a menos que su ejemplo 'workon' anterior cree una instancia de shell.
Tal vez puedas mirar algo como
Pero el script también crea una subshell.
En resumen, probablemente necesitará niveles desordenados de subcapas para que esto funcione.
fuente
He trabajado en casas de software de producción donde simplemente creamos nuevos usuarios y grupos para diversas funciones. Las nuevas cuentas de usuario específicamente para la gestión de la configuración o las compilaciones de software con niveles variables de visibilidad en otras áreas funcionales relacionadas a través de la pertenencia a grupos y ACL, y el historial de comandos realizado por say, se
cmmgrguardaría~cmmgr/.bash_history,bldmgrlas palabras relacionadas se guardarían~bldmgr/.bash_history, etc. Desafortunadamente, para iniciar sesión, un usuario debe ser propietario de su directorio de inicio de sesión. Por lo tanto, se configuró un área de proyecto en un disco separado por completo. La propiedad del creador del archivo mostró qué área funcional creó los archivos en el área del proyecto, para lo cual.bash_historyse puede examinar el apropiado .Sin embargo, el enfoque anterior no le brinda la granularidad que desea, sin embargo, le brinda un esqueleto que, cuando se combina con la pertenencia a un grupo, un usuario podría cambiar de grupo con lo
newgrpque efectivamente crea un nuevo shell y entorno, y luego usar uno de los enfoques dados en las otras respuestas para alterar el~/.bash_historyarchivo efectivo al cambiar sombreros para decir, decmmgrmodo que senewgrppueda administrar cuál~/.bash_historyse usa y guarda por carpeta a medida que uno ingresa y sale del nuevo grupo a través delnewgrpcomando. Echa un vistazoman newgrp. Hay algunos puntos de partida a lo largo de estas líneas en otras respuestas a esta pregunta. Estos deberían funcionar con el paradigma de grupo UNIX: la mayoría de las tuercas y tornillos son manejados por las rutinas de inicio y salida de shell controladas pornewgrpinvocación. Echa un vistazo anewgrp -l:fuente
Aquí presento dos variantes, pero aplicables solo a Z Shell .
Variante 1
Esto es lo que pensé por primera vez al leer el título de su pregunta. Con esta variante, puede cambiar entre dos modos de historial con ALT+ h: Global o local , donde este último cambia automáticamente a un historial por directorio en chdir . La historia global acumula todos los comandos emitidos.
Demostración
~ fuente src / cd_history ~ echo historia global historia global ~ mkdir foo bar ~ [ALT-h] ~ tenga en cuenta el indicador de historial local -> + ~ cd foo + ~ / foo echo historia local en foo + historia local en foo ~ / foo fc -l + 1 eco de la historia local en foo ~ / foo cd ../bar + ~ / bar echo historia local en bar + historia local en bar ~ / bar fc -l + 1 eco de la historia local en el bar ~ / bar cd ../foo + ~ / foo fc -l + 1 eco de la historia local en foo 3 cd ../bar ~ / foo [ALT-h] ~ / foo fc -l 55 fuente src / cd_history 64 echo historia global 65 mkdir foo bar 66 cd foo 70 echo historia local en bar 72 cd ../foo 73 echo historia local en foo 74 cd ../bar ~ / fooEl guión (para incluir
~/.zshrco para obtener)Variante 2
Pensándolo de nuevo, parece que el historial por directorio es demasiado detallado y también describe más un historial por proyecto en su cuerpo de preguntas. Así me ocurrió con otra variante con un workon función para cambiar entre proyectos. Cada proyecto tiene su propio archivo de historial
~/.zsh_projhistory_[name].Demostración
~ fuente src / proj_history ~ echo historia global historia global ~ [ALT-h] [use workon] ~ workon foo [use workon] ~ comando echo en proyecto foo [en proj foo] comando en proyecto foo ~ fc -l [en proj foo] 1 comando echo en proyecto foo ~ workon bar [en proj foo] ~ echo otro proyecto, llamado barra [en la barra de proyecto] otro proyecto, llamado bar ~ fc -l [en la barra de proyectos] 1 echo otro proyecto, llamado barra ~ workon foo [en la barra de proyectos] ~ fc -l [en proj foo] 1 comando echo en proyecto foo 3 barra de trabajo ~ [ALT-h] [en proj foo] ~ ~ fc -l 31 echo historia global 36 echo otro proyecto, llamado bar 38 workon foo 39 comando echo en proyecto foo 40 barra de trabajo ~ ls -1 .zsh_ * .zsh_history .zsh_projhistory_bar .zsh_projhistory_fooEl guión (para incluir
~/.zshrco para obtener)fuente
Después de trabajar en un área por un tiempo.
history> hist1.txt luego historia> hist2.txt
A veces uso la fecha para el nombre del archivo. historia> hist20180727.txt
De esta manera hay un historial de comandos reciente para cada directorio.
fuente