Eu tenho a seguinte linha:
$ for file in *.pdf; do if [[ $file != +(foo*|bar*|) ]]; then bash ~/typeset/scripts/myscript.sh $file; fi; done
$ rm *.pdf~
Eu uso essas linhas com muita frequência para trabalho (composição tipográfica), por isso as coloquei em um arquivo de texto, por exemplo, multi_myscript.sh
:
# begin of multi_myscript.sh
#!/bin/bash
for file in *.pdf;
do
if [[ $file != +(foo*|bar*|) ]]; then
bash ~/typeset/scripts/myscript.sh $file;
fi;
done
rm -f *.pdf~
# end of multi_myscript.sh
(Eu não posso ter certeza sobre myscript.sh
por causa da minha obrigação de confidencialidade. Ele usa algum comando do Ghostscript.)
Problema
Se eu executar minhas linhas diretamente de uma linha de comando, não haverá problemas e tudo funcionará bem.
Se eu executar minhas linhas a partir de um script, por exemplo
$ bash ~/myfolder/multi_myscript.sh
myfolder
está completamente congelado e, em seguida, aparece esta mensagem:
This windows might be busy and is not responding. Do you want to terminare the application? myfolder - File Manager
Por que isso acontece?
P. .: Eu sempre usei multi_myscript.sh
em 'Debian jessie stable' sem problemas. Eu descobri este problema depois que uma nova instalação do Debian se tornou estável. Meus outros scripts funcionam bem tanto de uma linha de comando quanto de um script.
Minha máquina: Debian GNU / Linux 9.0 (stretch) | Versão Linux 4.9.0-3-686-pae ([email protected]) (versão gcc 6.3.0 20170516 (Debian 6.3.0-18)) # 1 SMP Debian 4.9.30-2 + deb9u2 ( 2017-06-26) | CPU Intel (R) Core (TM) i7-3630QM a 2.40GHz com Turbo Boost até 3.4GHz | Arquitetura: i686 | Modo (s) operacional (es) da CPU: 32 bits, 64 bits | CPU (s): 8 | NVIDIA Corporation GK107M [GeForce GT 640M] (com VRAM dedicada de 2 GB)
Saída bash -x ~/myscripts/multi_myscript.sh
user@name:~/myfolder$ bash -x ~/myscripts/multi_myscript.sh
+ for file in *.pdf
+ [[ bar.pdf != +(foo*|bar*|) ]]
+ for file in *.pdf
+ [[ figure1.pdf != +(foo*|bar*|) ]]
+ bash /home/user/myscripts/multi_myscript.sh figure1.pdf
GPL Ghostscript 9.21 (2017-03-16)
Copyright (C) 2017 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
+ for file in *.pdf
+ [[ figure2.pdf != +(foo*|bar*|) ]]
++ bash /home/user/myscripts/multi_myscript.sh figure2.pdf
GPL Ghostscript 9.21 (2017-03-16)
Copyright (C) 2017 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
+ for file in *.pdf
+ [[ figure3.pdf != +(foo*|bar*|) ]]
+ bash /home/user/myscripts/multi_myscript.sh figure3.pdf
GPL Ghostscript 9.21 (2017-03-16)
Copyright (C) 2017 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
+ for file in *.pdf
+ [[ foo.pdf != +(foo*|bar*|) ]]
+ rm -f figure1.pdf~ figure2.pdf~ figure3.pdf~
user@name:~/myfolder$
Esclarecimentos
O problema é um congelamento do meu gerenciador de arquivos: a pasta na qual eu corro multi_myscrpt.sh
está congelada e eu tenho que terminá-lo manualmente (veja a mensagem do meu sistema acima).
O que eu faço
Eu executo meu script, a linha de comando funciona e ele aguarda novos comandos (como você pode ver na última linha de saída de bash -x ...
acima), mas a pasta na qual executei meu script está congelada e Existe um arquivo tmp que deve ser excluído automaticamente pelo próprio script. Eu suponho que este arquivo tmp congela meu gerenciador de arquivos e eu não entendo por que ... Se eu executar o meu código diretamente no meu terminal funciona bem e não há arquivos tmp em myfolder
. Existem apenas minhas saídas.
myscript.sh
recebe um pdf como entrada, grava alguns arquivos tmp nos quais opera e depois sobrescreve o pdf original que inicia minha saída. Além disso, exclui o arquivo tmp intermediário, mas não todos. De fato, eu adicionei rm *.pdf~
.
Eu não escrevi myscripts.sh
sozinho. É um script que eu tenho que usar para o trabalho e minha empresa me deu. Meus colegas também o usam e está tudo bem, caso contrário, minha equipe teria conseguido (não posso mostrá-lo por causa de minha obrigação de confidencialidade).
Escrevi multi_myscript.sh
para economizar tempo porque myscript.sh
aceita apenas uma entrada e geralmente tenho que executá-la em muitos arquivos pdf.
Estou trabalhando em uma nova instalação do Debian stretch: o sistema é limpo e contém apenas tudo o que eu preciso para o meu trabalho.
Poderia ser um bug do Debian stretch? No Debian jessie e wheezy eu nunca tive problemas com multi_myscript.sh
.
Conclusão
A pergunta é: por que se eu escrevo um código diretamente no meu terminal ele funciona, enquanto o mesmo código exatamente escrito em um arquivo e chamado pelo terminal não funciona?
$ for file in *.pdf; do ...
funciona.
$ bash ~/myfolder/multi_myscript.sh
não funciona e multi_myscript.sh
contém exatamente o mesmo código for file in *.pdf; do ...
.
É claro que posso executar meu código diretamente em um terminal, mas gostaria de entender por que meu sistema se comporta assim.
Espero que minha explicação seja mais clara.
Tags command-line scripting