Comando Bash “script” em arquivos bash?

Comando Bash “script” em arquivos bash?

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.txtno primeiro arquivo myscriptnã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.txtno primeiro arquivo myscriptnã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á scriptneste caso.

Se o executável fosse sleep, tarou ls, você esperaria que o shell esperasse até que o executável terminasse antes de interpretar o restante do myscript. Com scriptisso não é diferente: o shell espera scriptterminar.

scriptdestina-se ao uso interativo. script ~/script.txtexecuta um shell interativo que não é o shell que interpreta myscript. Você escreveu "a janela fecha" (quando sem script), então presumo que myscriptseja executado em algum emulador de terminal que exibe uma janela. Se sim, então (com script) você provavelmente viu esse shell interno iniciado scripte poderia interagir com ele enquanto o shell externo estava esperando. scriptregistra o que você faz no shell interno. A saída do shell interno termina scripte 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 scriptque chamado de dentro myscriptnão pode ajudá-lo na depuração myscript, mesmo que o shell externo continue.

Existem pelo menos dois métodos para depurar myscript:

  1. 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 myscriptgerar 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 myscriptfor executado sem um terminal.

  2. 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 se myscriptacontecer com exitele killmesmo ou execcom outro executável, ele nunca chegará à linha com bash; leve isso em consideração.

    Se por algum motivo o interativo bashiniciado a partir do script limpar o terminal ou algo assim, use sleep 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 myscriptpara fazer o shell interpretá-lo imprimir comandos e seus argumentos à medida que são executados. Isso deve fornecer informações úteis.

informação relacionada