Tente executar o script como um script em vez de pesquisá-lo:
$ bash <scriptname>
Eu tenho um script Bash de mil linhas, cada uma contendo um comando ffmpeg
. Eu começo isto com source script
e corre muito bem.
No entanto, quando tento assumir o controle desse script de várias maneiras, as coisas ficam completamente erradas:
Ctrl + Z
para pausar a coisa toda, somente o comando atual ffmpeg
é pausado, e o próximo é iniciado! Não é o que eu queria! Ctrl + C
para parar tudo, o script pula para o próximo comando ffmpeg
, e eu tenho que pressionar uma vez para cada linha no script para
finalmente pare tudo. Inferno absoluto. ps -ef
de outro shell para localizar o comando source
para pausar / eliminá-lo de lá, mas ele não existe na lista. Então, como posso pausar / parar o script pai da maneira que desejo? Ou possivelmente, como posso executar o script de uma maneira diferente para começar, o que me dá o controle adequado sobre isso?
O problema é que ffmpeg
captura o SIGINT
- sinal enviado por Ctrl + C - mas ele é ignorado no bash, pois não sabe se o sinal é destinado a ele também.
Um remédio para isso é adicionar uma trap para o sinal no script e tratá-lo localmente.
Por exemplo, adicione uma armadilha ao início do arquivo com comandos. Em seguida, torne-o executável e execute-o ou por % $ bash script_file
- não source
:
trap 'exit' INT
Uma linha mais chique que aborta com mensagem e status de saída 130 :
trap 'printf "Received SIGINT: Terminating.\n";exit 130' INT
Então:
$ ./file_with_commands
Ou um script matador de sourcing:
#!/bin/bash
trap 'printf "Received SIGINT: Terminating.\n";exit 130' INT
source "$1"
Então:
$ ./sourcetrap file_with_commands
Um exemplo simples de script pode ser:
#!/bin/bash
if [[ $1 = trap ]]; then
trap 'printf "Received SIGINT: Terminating.\n";exit 130' INT
fi
ping localhost
ping localhost
ping localhost
./script_name
./script_name trap
Então Ctrl + C para testemunhar a diferença.
E novamente; não source
estes scripts do terminal.