Batida de tecla de terminal / combinação para pular apenas a passagem atual em uma execução de script de shell

1

Eu frequentemente executo scripts bash no debian e em geral no linux.

Nós todos sabemos que a combinação de teclas CTRL + C para quebrar o programa atual e fechar o executável / script, mas esta tecla terminar o lote / script completamente.

O que eu estou procurando, em vez disso, é um pressionamento de tecla para apenas SKIP (como um CTRL + C aninhado) apenas para a passagem real mesmo se não fazer essa passagem resultaria em uma situação de bugs, como o que "quebrar" e "continuar" fazer em um ciclo.

Exemplo de script:

demo.sh

wget http://something_from_the_internet...
unzip that_file
ping my_host
4th passage...
5th passage...

Eu gostaria de acertar a combinação para pular para o comando 2 (neste caso, unzip), ou apertar duas vezes e ir diretamente para o terceiro comando (neste caso o ping ...).

Em muitos casos, o resultado de um arquivo de script é dado por todas as passagens. mas no meu caso não, para testes, uma combinação como essa me permitiria executar e testar coisas sem ter necessidade de comentar as linhas na parte superior apenas para verificar rapidamente as últimas informações na parte inferior.

    
por user3450548 08.11.2017 / 11:54

2 respostas

1

Você não pode "pular" um processo em execução com o bash. De acordo com esta página dos documentos do bash, mesmo que tenha um comportamento de ignorar um sinal , esperaria até que o processo terminasse a execução para emitir o salto, efetivamente ignorando apenas as seguintes instruções. Você pode, no entanto, mudar a maneira como seu script é executado para que ele mate o processo de descompactação para você, se estiver executando em segundo plano, ao receber um SIGINT, por exemplo ( guia ).

    
por 08.11.2017 / 13:48
0

Você tem a opção de capturar o sinal SIGINT usando o trap do Bash:

trap [COMMANDS] [SIGNALS]

Você pode, por exemplo, capturar um SIGINT que foi enviado para o script em primeiro plano para enviar um sinal ao processo que foi bifurcado do script.

Nesse caso, no entanto, você precisará do PID do processo bifurcado. Você pode usar a variável $! do Bash, mas ela só funciona para processos que foram bifurcados em segundo plano.

Como solução alternativa, para preservar a natureza síncrona do seu script, você pode chamar explicitamente wait no PID retornado.

#!/usr/bin/env bash

function skip() {
  kill -SIGTERM $!
}

trap skip SIGINT

ping ... &
wait $!

wget ... &
wait $!

unzip ... &
wait $!
    
por 19.05.2018 / 07:42