
Eu tenho um script bash, /usr/bin/local/myscript. Eu executo o arquivo geralmente a partir de um software externo (no meu caso Autohotkey), basicamente quero dizer que o script será concluído imediatamente e a janela será fechada, então não consigo ver nenhum log na janela, log de informações ou log de erros. Então, eu gosto de "criar scripts" de todas as etapas de execução para depuração quando o programa não funcionou bem. Mas simplesmente colocar a script ~/script.txt
no primeiro arquivo myscript
não funcionou, não sei o que está acontecendo, as próximas linhas do arquivo não foram executadas basicamente. Então, existe uma maneira (adequada) de usar "script" em arquivos bash ou uma alternativa melhor ao "script" para isso?
Responder1
Mas simplesmente colocar a
script ~/script.txt
no primeiro arquivomyscript
não funcionou, não sei o que está acontecendo, as próximas linhas do arquivo não foram executadas basicamente.
Para uma interpretação de shell myscript
, script ~/script.txt
é apenas um comando que executa um executável externo. O executável está script
neste caso.
Se o executável fosse sleep
, tar
ou ls
, você esperaria que o shell esperasse até que o executável terminasse antes de interpretar o restante do myscript
. Com script
isso não é diferente: o shell espera script
terminar.
script
destina-se ao uso interativo. script ~/script.txt
executa um shell interativo que não é o shell que interpreta myscript
. Você escreveu "a janela fecha" (quando sem script
), então presumo que myscript
seja executado em algum emulador de terminal que exibe uma janela. Se sim, então (com script
) você provavelmente viu esse shell interno iniciado script
e poderia interagir com ele enquanto o shell externo estava esperando. script
registra o que você faz no shell interno. A saída do shell interno termina script
e só então o shell externo (ou seja myscript
) continua. Mas talvez você tenha fechado o emulador de terminal, o shell externo recebeu SIGHUP e nunca mais continuou.
Isso não é importante, pois agora deve estar claro script
que chamado de dentro myscript
não pode ajudá-lo na depuração myscript
, mesmo que o shell externo continue.
Existem pelo menos dois métodos para depurar myscript
:
Redirecione o stderr do script para um arquivo de log. Isso pode ser feito dentro do script com
# just after shebang exec 2>/path/to/logfile
Se
myscript
gerar uma saída em seu stdout que seja importante e realmente vá para algum lugar (por meio de um canal ou redirecionamento), então você não deseja quebrar isso. Mas se normalmente for impresso no terminal e você quiser registrar isso também, redirecione stderr e stdout para o arquivo de log:# just after shebang exec 2>/path/to/logfile 1>&2
Este método funcionará mesmo se
myscript
for executado sem um terminal.Como alternativa, deixe o script executar um shell interativo (por exemplo,
bash
) bem no final. O novo shell impedirá que a janela feche e você poderá ver o que o script imprimiu no terminal até agora. Obviamente, isso requer um terminal. Observe que semyscript
acontecer comexit
elekill
mesmo ouexec
com outro executável, ele nunca chegará à linha combash
; leve isso em consideração.Se por algum motivo o interativo
bash
iniciado a partir do script limpar o terminal ou algo assim, usesleep 3600
. A questão é que você realmente não precisa de um shell extra, você precisa de qualquer processo que mantenha o emulador de terminal aberto por tempo suficiente para poder examinar a saída anterior.
Não importa qual método você escolha, coloque
set -x
no início myscript
para fazer o shell interpretá-lo imprimir comandos e seus argumentos à medida que são executados. Isso deve fornecer informações úteis.