Gostaria de receber uma notificação na área de trabalho sempre que um comando que tenha sido executado por mais de, digamos 15 segundos, termine em um shell interativo.
Em outras palavras, eu gostaria que todos os comandos fossem agrupados em algo assim
start=$(date +%s);
ORIGINAL_COMMAND;
[ $(($(date +%s) - start)) -le 15 ] || notify-send "Long running command finished"
Qual é a melhor maneira de fazer isso no bash?
bash
notification
aioobe
fonte
fonte
Respostas:
Você deseja https://launchpad.net/undistract-me (instalável a partir dos arquivos do Ubuntu
sudo apt-get install undistract-me
) que faz exatamente o que você está solicitando, incluindo o trabalho automático (ou seja, sem ter que se lembrar de adicionar algo extra para potencialmente longo- comandos em execução).fonte
sleep 30
, mas sem notificação..bashrc
:. /usr/share/undistract-me/long-running.bash
notify_when_long_running_commands_finish_install
. Parece ser um bug: github.com/jml/undistract-me/issues/23Tanto quanto eu entendi, você quer um invólucro . E você deseja usar um comando através dele para que ele lhe dê a notificação desejada se o tempo de execução do seu comando for superior a 15 segundos. Então aqui está.
Copie esta função no seu
~/.bashrc
e source~/.bashrc
como,Uso
Se demorar mais de 15 segundos, você receberá a notificação da área de trabalho descrevendo o comando e seu tempo de execução.
Exemplo
fonte
"$@"
não$@
. Grande diferença.wrapper
na frente de cada comando digitado.command; alert
é na verdade menor do quewrapper command
:-)notify-send
prazo de validade expire por um longo período, forneça um tempo limite personalizado para notificação / envio (em milissegundos). por exemplo,notify-send --expire-time 999999999 ...
No
~/.bashrc
existe um aliasalert
definido como:que pode ser usado para notificar a conclusão da execução do comando.
Uso:
por exemplo
Você pode personalizar o alias conforme sua necessidade e desejo.
fonte
Além de um invólucro como souravc sugerido, não há realmente nenhuma boa maneira de fazer isso no bash. Você pode invadir o local com uma interceptação DEBUG e um PROMPT_COMMAND. Uma interceptação DEBUG é acionada sempre que você executa um comando e PROMPT_COMMAND é executado imediatamente antes da gravação do prompt.
Então, coisas para
~/.bashrc
se tornam algo comoIsso é um truque, então não se surpreenda se você encontrar efeitos colaterais estranhos com isso.
fonte
EDITAR
TL; DR : criar atalho de preenchimento automático
.inputrc
e funcionar em.bashrc
. Execute o comando como de costume, digite, mas, em vez de ENTER, pressione o atalho especificado em.inputrc
A pessoa que colocou recompensa nessa questão disse:
Enquanto pesquisava as soluções para esse problema, eu me deparei com essa pergunta no stackexchange, que permite a ligação CtrlJa uma sequência de comandos: Ctrla(vá para o início da linha), coloque a string "mesure" na frente do comando que você digitou, Ctrlm(execute)
Assim, você obtém a funcionalidade de preenchimento automático e ENTERcomando separado para medir o tempo, enquanto mantém o objetivo original da segunda função que publiquei abaixo.
A partir de agora, aqui está o conteúdo do meu
~/.inputrc
arquivo:"\C-j": "\C-a measure \C-m"
E aqui está o conteúdo de
.bashrc
(note, eu não uso o bash há sempre - eu uso o mksh como meu shell, portanto é isso que você vê no post original. A funcionalidade ainda é a mesma)Correio Original
Aqui está a minha ideia - usar uma função no
.bashrc
. Princípio básico - use/usr/bin/time
para medir o tempo necessário para a conclusão do comando e, se demorar mais de 15 segundos, envie uma notificação.Aqui estou redirecionando a saída para,
/dev/null
mas para visualizar a saída, o redirecionamento para o arquivo também pode ser feito.Uma abordagem muito melhor, IMHO, é enviar saída de tempo para algum arquivo na sua pasta pessoal (apenas para você não poluir seu sistema com arquivos de tempo e sempre saber para onde procurar). Aqui está a segunda versão
E aqui estão as capturas de tela da primeira e da segunda versão, nessa ordem
Primeira versão, sem saída
Segunda versão, com saída
fonte
sudo lsof
e principalmente comping -c20 google.com
.Recentemente, criei uma ferramenta que serve a esse propósito. Ele pode ser executado como um wrapper ou automaticamente com a integração do shell. Confira aqui: http://ntfy.rtfd.io
Para instalá-lo:
Para usá-lo como um invólucro:
Para receber notificações automaticamente, adicione-o ao seu
.bashrc
ou.zshrc
:fonte
Seu script funciona muito bem, apenas inclua a linha 'shebang' (
#!/bin/bash
) . Outros#!/bin/bash
mencionados aqui , mas na maioria das vezes,#!/bin/bash
funcionam bem para scripts bash do Unix. É exigido pelo interpretador de script para que ele saiba que tipo de script é.Isso parece funcionar como um script de teste:
Para modificar esse script, coloque o (s) comando (s) onde estão as linhas
echo
esleep
.Observe que
notify-send
, você também pode-i
especificar um ícone :-)Além disso, verifique se ele é executável executando
chmod +x /PATH/TO/FILE
-o primeiro.fonte
Você pode modificar o Bash para implementar a funcionalidade do wrapper desejada.
Se você está disposto a fazer muitas modificações no seu shell interativo, considere mudar para um shell intrinsecamente hackável como o eshell, que é construído usando o Emacs elisp e tem toda a sua capacidade de personalização:
http://www.masteringemacs.org/articles/2010/12/13/complete-guide-mastering-eshell/
fonte
Você também pode fazer isso com uma declaração if simples como esta
Você pode usar seus próprios nomes de variáveis.
Posso confirmar que isso funciona, testei com um comando que demora muito para terminar e um que não funciona e a notificação chega para aquele que demora muito
Você também pode fazer isso com qualquer comando, substituindo
ORIGINAL_COMMAND
com$@
e executar o script como./script command
.fonte
$((2+2))
é um bash embutido, não requer nenhum programa adicional. Terceiro: não funciona com comandos que possuem espaços. tl; dr: é pior que as outras respostas de 1 ano