Você poderia executá-lo em um subshell com uma armadilha apropriada. Por exemplo, se você quisesse executar echo -e '\nCommand done
no final de um while true; do true; done
, você poderia usar isto:
mario@mario-K53SV:~$ (trap 'echo -e "\nCommand done"' EXIT; while true; do true; done)
O trap registra o comando que você definiu no evento EXIT do subshell. Os parênteses são necessários para criar uma subcamada. Esteja ciente de que, caso queira generalizar isso e colocar seus comandos em variáveis (por exemplo, MY_COMMAND='while true; do true; done'
), você precisará de eval
para executá-los corretamente. Este exemplo de saída mostra exatamente onde é útil (sem eval, isso não funcionaria):
mario@mario-K53SV:~$ YOUR_COMMAND="while true; do true; done"
mario@mario-K53SV:~$ EXECUTE_ON_EXIT="echo -e '\nCommand done'"
mario@mario-K53SV:~$ (trap 'eval ${EXECUTE_ON_EXIT}' EXIT; eval ${YOUR_COMMAND})
^C
Command done
mario@mario-K53SV:~$
Se desejar, isso também pode ser usado para fechar automaticamente o terminal , no final do comando do manipulador EXIT: basta incluir kill -s SIGHUP $$
no final do seu manipulador (por exemplo, EXECUTE_ON_EXIT="echo -e '\nCommand done'; kill -s SIGHUP $$"
).