Me gustaría recibir una notificación de escritorio cada vez que un comando que se haya ejecutado durante más de 15 segundos, termine en un shell interactivo.
En otras palabras, me gustaría que todos los comandos se envuelvan en algo como esto
start=$(date +%s);
ORIGINAL_COMMAND;
[ $(($(date +%s) - start)) -le 15 ] || notify-send "Long running command finished"
¿Cuál es la mejor manera de lograr esto en bash?
bash
notification
aioobe
fuente
fuente
Respuestas:
Desea https://launchpad.net/undistract-me (instalable desde los archivos de Ubuntu con
sudo apt-get install undistract-me
) que hace exactamente lo que está pidiendo, incluido el trabajo automático (es decir, sin tener que acordarse de agregar algo extra a un tiempo potencialmente largo) ejecutando comandos).fuente
sleep 30
, pero sin notificación..bashrc
:. /usr/share/undistract-me/long-running.bash
notify_when_long_running_commands_finish_install
. Parece ser un error: github.com/jml/undistract-me/issues/23Según tengo entendido, quieres un envoltorio . Y desea usar un comando a través de él para que le dé la notificación deseada si el tiempo de ejecución de su comando es más de 15 segundos. Así que aquí está.
Copie esta función en su
~/.bashrc
y fuente~/.bashrc
como,Uso
Si tarda más de 15 segundos, recibirá la notificación de escritorio que describe el comando y su tiempo de ejecución.
Ejemplo
fuente
"$@"
, No$@
. Gran diferencia.wrapper
embargo, me gustaría evitar escribir delante de cada comando que escribo .command; alert
de hecho es más corto quewrapper command
:-)notify-send
que caduque por un tiempo prolongado, envíe un tiempo de espera personalizado a notificar y enviar (en milisegundos). por ejemplonotify-send --expire-time 999999999 ...
En
~/.bashrc
hay un aliasalert
definido como:que se puede usar para notificar la finalización de la ejecución del comando.
Uso:
p.ej
Puede personalizar el alias según sus necesidades y deseos.
fuente
Además de una envoltura como la sugerida por souravc, en realidad no hay una buena manera de hacer esto en bash. Puedes hackearlo con una trampa DEBUG y un PROMPT_COMMAND. Cuando se ejecuta un comando, se activa una captura DEBUG y PROMPT_COMMAND se ejecuta justo antes de que se escriba la solicitud.
Así que las cosas se
~/.bashrc
convierten en algo así comoEste es un truco, así que no te sorprendas si encuentras efectos secundarios extraños con esto.
fuente
EDITAR
TL; DR : crea un acceso directo de autocompletado
.inputrc
y funciona en.bashrc
. Ejecute el comando como de costumbre, escriba, pero en lugar de ENTER, presione el acceso directo que especificó en.inputrc
La persona que puso recompensa por esta pregunta dijo:
Mientras investigaba las soluciones a este problema, me topé con esta pregunta desde stackexchange, que permite vincular CtrlJa una secuencia de comandos: Ctrla(mover al comienzo de la línea), colocar la cadena "mesure" delante del comando que ingresó, Ctrlm(ejecutar)
Por lo tanto, obtiene la funcionalidad de autocompletar y un ENTERcomando separado para medir el tiempo, al tiempo que conserva el propósito original de la segunda función que publiqué a continuación.
A partir de ahora, aquí están los contenidos de mi
~/.inputrc
archivo:"\C-j": "\C-a measure \C-m"
Y aquí están los contenidos de
.bashrc
(nota, no he estado usando bash para siempre, uso mksh como mi shell, por lo tanto, eso es lo que ves en la publicación original. La funcionalidad sigue siendo la misma)Publicación original
Aquí está mi idea: use una función en
.bashrc
. Principio básico: utilícelo/usr/bin/time
para medir el tiempo que tarda el comando en completarse y, si es superior a 15 segundos, envíe una notificación.Aquí estoy redirigiendo la salida,
/dev/null
pero para ver la salida, también se puede hacer la redirección al archivo.Un enfoque mucho mejor, en mi humilde opinión, es enviar la salida de tiempo a algún archivo en su carpeta de inicio (solo para que no contamine su sistema con archivos de tiempo y siempre sepa dónde buscar). Aquí está esa segunda versión
Y aquí están las capturas de pantalla de la primera y segunda versión, en ese orden
Primera versión, sin salida
Segunda versión, con salida
fuente
sudo lsof
y principalmente conping -c20 google.com
.Recientemente construí una herramienta que sirve para este propósito. Puede ejecutarse como un contenedor o automáticamente con integración de shell. Compruébalo aquí: http://ntfy.rtfd.io
Para instalarlo:
Para usarlo como envoltorio:
Para recibir notificaciones automáticamente, agregue esto a su
.bashrc
o.zshrc
:fuente
Su script funciona bastante bien, solo asegúrese de incluir la línea 'shebang' (
#!/bin/bash
) . Otros que#!/bin/bash
se mencionan aquí , pero la mayoría de las veces,#!/bin/bash
funciona bien para los scripts bash Unix. Es requerido por el intérprete de guiones para que sepa qué tipo de guión es.Esto parece funcionar como un script de prueba:
Para modificar este script, coloque los comandos donde están las líneas
echo
ysleep
.Tenga en cuenta
notify-send
que también puede usar-i
para especificar un icono :-)Además, asegúrese de que sea ejecutable ejecutándolo
chmod +x /PATH/TO/FILE
primero.fuente
Puede modificar Bash para implementar la funcionalidad de envoltura que desee.
Si está dispuesto a realizar muchas de estas modificaciones en su shell interactivo, podría considerar cambiar a un shell intrínsecamente pirateable como eshell, que está construido con Emacs elisp y tiene toda su personalización histórica:
http://www.masteringemacs.org/articles/2010/12/13/complete-guide-mastering-eshell/
fuente
También puede hacer esto con una simple declaración if como esta
Puede usar sus propios nombres de variables.
Puedo confirmar que esto funciona, lo probé con un comando que tarda mucho en terminar y otro que no funciona, y la notificación llega para el que lleva mucho tiempo
También puede hacer esto con cualquier comando mediante la sustitución
ORIGINAL_COMMAND
con$@
y ejecutar el script como./script command
.fuente
$((2+2))
es un bash incorporado, no requiere ningún programa adicional. Tercero: no funciona con comandos que tienen espacios. tl; dr: es peor que las otras respuestas de 1 año