A menudo uso find
o locate
para averiguar sobre caminos.
(~) locate foobar.mmpz
/home/progo/lmms/projects/foobar.mmpz
El siguiente paso es abrir o manipular los archivos. En un caso feliz como el anterior, puedo hacer esto:
(~) ls `!!`
ls `locate foobar.mmpz`
/home/progo/lmms/projects/foobar.mmpz
Pero nadie está muy contento cuando hay muchas líneas de salida, algunas de las cuales pueden no ser rutas u otra cosa de ese tipo. Además, volver a ejecutar comandos potencialmente derrochadores tampoco es tan elegante.
¿Habría una manera de conectar zsh para almacenar el stdout en una matriz para su posterior manipulación? Después de todo, el trabajo del shell es redirigir las transmisiones al usuario. Estoy pensando que podría almacenar la primera N y la última N líneas en una variable para su uso inmediato posterior, como $?
y otros.
Ok, esto es genial: /unix//a/59704/5674 . Ahora estoy preguntando sobre el conocimiento de zsh (y portando el código a zsh) para manipular este tipo de captura después de cada línea de ejecución.
screen
oscript
y precmd y preexec hooks.Respuestas:
No hay una función para capturar la salida de la pantalla en la mayoría de los emuladores de terminal. Me parece recordar que el autor de xterm (el emulador de terminal de "referencia") declaró que sería difícil de implementar. Incluso si eso fuera posible, el proyectil tendría que hacer un seguimiento de dónde había estado el último aviso.
Por lo tanto, no escapará de tener que ejecutar el comando nuevamente, a menos que use un mecanismo manual específico de terminal, como copiar y pegar con el mouse en xterm o con el teclado en pantalla.
Sería muy poco práctico para el shell capturar automáticamente la salida de comandos, porque no puede distinguir entre comandos que tienen complejas terminales e interacciones del usuario de comandos que simplemente generan caracteres imprimibles.
Puede volver a ejecutar el comando y capturar su salida. Hay varias formas de hacer cada uno. Para volver a ejecutar el comando, puede usar:
!!
sustitución de historial: más conveniente para escribir;fc -e -
, que se puede usar en una función.Para capturar la salida, puede usar la sustitución de comandos o una función como la siguiente:
Esto establece la
lines
matriz en la salida del comando que se canaliza en ella.fuente
K
suyo.Aquí hay un primer corte de algo para poner la última línea de salida en una variable llamada
$lastline
.Este usos de zsh
preexec
gancho para que se ejecuteexec
contee
para almacenar una copia de la salida estándar del comando, a continuación, utilizaprecmd
para leer la salida almacenada y restaurar la salida estándar a ser sólo el terminal para mostrar el símbolo.Pero aún necesita algo de trabajo. Por ejemplo, dado que stdout ya no es una terminal, los programas como
vim
yless
no funcionan correctamente.Hay información útil relacionada en estas preguntas:
fuente
exec
llamadas en el código, ¿se está ejecutando el comando varias veces o estoy atrapado en una semántica especial?exec
sin un nombre de programa solo establece redirecciones.Puede hacerlo simplemente canalizando sus resultados a
tee
, lo que simplemente guarda el resultado en un archivo y lo muestra al mismo tiempo.Entonces, por ejemplo, podría hacer esto, que muestra su salida como normal, pero también la guarda en el archivo
/tmp/it
locate foobar.mmpz | tee /tmp/it
luego tome ese archivo y agrúpelo para seleccionar cosas, por ejemplo
cat /tmp/it | grep progo | grep lms
entonces para usarlo, podrías hacer esto:
vi $(!!)
fuente
Se me ocurrió esta solución a medio hornear:
Esto le permite escribir
___
en cualquier punto de la línea de comando. El comando anterior se volverá a ejecutar y___
se reemplazará con la última línea de su salida. Ejemplo de uso:El último comando se expandirá a
vim foo
.¡Esto tiene algunos bordes afilados!
Si incluye
___
un comando pero el comando anterior también incluyó un___
, el shell se colgará en un estado extraño por un tiempo. Puede salir de este estado inmediatamente con Ctrl- C.Tampoco puede presionar Tabpara expandir
___
, como puede hacerlo con!$
otras construcciones.Algunos comandos mostrarán diferentes resultados cuando se ejecutan "normalmente" y cuando están conectados a una tubería. (Compare el resultado de
ls
yls | cat
.) Si el comando activado por___
es uno de estos, puede terminar ejecutando un comando diferente al esperado.Y, por supuesto, si desea hacer algo con una línea de salida que no sea la última, esto no lo ayudará.
Elegí el nombre
___
porque es algo que nunca he querido incluir como palabra en una línea de comando, ni siquiera como argumento. Puede elegir un nombre diferente, pero tenga cuidado de no elegir algo que pueda expandirse sin darse cuenta.fuente