Posso executar um comando depois que o usuário usa Ctrl-C para matar um comando?

3

Então, na minha posição, usamos um conjunto compartilhado de aliases para fazer construções. Algo como ...

alias 'build'='cd $BUILD_ROOT; m; cp ...; cp...; deploy; deploy; deploy; cd -'

Isso é super irritante porque o comando make demora cerca de 3 minutos e eu geralmente percebo que eu perdi alguma coisa, pressione Ctrl-C e, em seguida, imediatamente executei o build novamente. Isso me deixa em um diretório no qual não me importo, com um caminho doloroso para digitar novamente.

O que eu realmente gostaria é algo como ...

alias 'betterbuild'='pushd .; build; even-if-the-user-cancelled popd'

Existe uma maneira de fazer isso?

    
por Hounshell 02.08.2013 / 18:23

2 respostas

4

Você pode usar um subshell.

alias build='( cd $BUILD_ROOT; m; cp ...; cp...; deploy; deploy; deploy; )'

No exemplo acima, cd $BUILD_ROOT altera o diretório de trabalho atual de o subshell, mas não o shell interativo que chama o alias. Para um genérico Nesse caso, você pode usar um subshell e um trap de saída.

alias build='( cleanup() { do; cleanup; }; trap cleanup EXIT; cd $BUILD_ROOT; m; cp ...; cp...; deploy; deploy; deploy; )'

Reconsiderar o uso de um script. O exemplo acima seria muito mais limpo em um script. Os scripts são interpretados em suas próprias instâncias do shell. O subshell a sintaxe não seria necessária em um script.

Você mencionou em um comentário que os scripts dependem do seu alias. Isso sugere que você está sourcing seus scripts em vez de executá-los, o que é geralmente uma má prática. Além disso, você mencionou que existem aliases que dependa do seu alias. Você pode usar scripts em aliases.

    
por 02.08.2013 / 18:29
3

Bem, eu diria que seja um script, porque os aliases não são destinados a fazer coisas complexas como essa e os scripts são feitos para tarefas mais complexas ou de execução mais longa. Os aliases são basicamente para mapear um comando para outro, por exemplo, para fornecer parâmetros padrão para um comando que não suporta nativamente.

No entanto, como você afirmou em um comentário que deseja manter um alias, precisaremos descobrir como fazer o que quiser dentro dos limites de um alias.

A escolha natural, então, é lançar um subshell a partir do alias. Por exemplo:

~$ alias xyz1='( cd ~/tmp; sleep 10; cd ~ )'
~$ alias xyz2='cd ~/tmp; sleep 10; cd ~'
~$ xyz2
^C
~/tmp$ cd
~$ xyz1
^C
~$

Isso altera o diretório de trabalho somente dentro do subshell, que sai quando o alias termina de executar normalmente ou é abortado, por exemplo. através de Ctrl + C .

    
por 02.08.2013 / 18:29