Existe uma maneira fácil de registrar todas as atividades que um script de shell faz?

18

Existe uma maneira fácil de registrar todas as atividades que ocorrem de um script de shell para um arquivo?

Eu tenho um roteiro. Ele gera coisas como "instruções" de eco, assim como outras saídas do programa. Eu conheço os comandos:

command | tee -a "$log_file"

e

command >> logifle.log

O que estou perguntando é se existe um parâmetro de shell para o log ou um comando set que eu possa usar ou algo assim. Não quero necessariamente adicionar dezenas de redirecionamentos ou tee aos arquivos, se não for necessário. Ainda quero obter a saída std - só quero que ela seja registrada.: Wq

j0h
fonte
5
LOL
,:
11
Isso confunde a minha mente que a maioria das pessoas parecem fazer que em vez de: x
Apologize e restabelecer Monica

Respostas:

18

se você normalmente executa seu script foo.sh, tente executá-lo (assumindo que seja um script bash) com bash -x foo.sh. Se você deseja que tudo seja redirecionado para o arquivo, tente bash -x foo.sh > file.log 2>&1(note que eu também estou redirecionando o stderr, remova o arquivo 2>&1se você não quiser). Se você também quiser ver o que está acontecendo bash -x foo.sh 2>&1 | tee log.file,.

roadmr
fonte
20

Existe uma maneira muito fácil e prática:

Usando scriptpara criar texto datilografado da sessão do terminal

  1. Inicie o comando script

    Se o argumento filefor dado, por exemplo script ~/tmp/output, scriptsalva o diálogo neste arquivo. Se nenhum nome de arquivo for fornecido, o diálogo será salvo no arquivotypescript

  2. Inicie seu script ou o que você quiser começar

  3. Se seu script terminar, pare scriptpor Ctrl-D

  4. Verifique a saída no arquivo de saída padrão typescript


Para iniciar seu comando em uma etapa script, use o parâmetro-c

-c COMMAND
    Run the COMMAND rather than an interactive 
    shell. This makes it easy for a script to capture
    the output of a program that behaves differently
    when its stdout is not a tty.

O uso de scriptdentro do seu script não faz sentido porque scriptbifurca o shell ou inicia um novo shell.

Se a variável SHELL existir, o shell bifurcado pelo script será esse shell. Se SHELL não estiver definido, o shell Bourne será assumido. (A maioria dos shells define essa variável automaticamente).

AB
fonte
4
@Fabby Gosto da minha resposta, mas não vejo a coisinha cinzenta;)
AB
Eu uso script logfilename, então pego.
waltinator
posso chamar "script" do meu programa shell?
J0h 30/07
11
Isso não faz sentido, veja minha resposta melhorada.
AB
11
+1. Obrigado por esta resposta :-) scripttambém é útil um monitoramento via fifo. From man script: " -f, --flushLiberar a saída após cada gravação. Isso é bom para a telecooperação: uma pessoa faz mkfifo foo; script -f fooe outra pode supervisionar em tempo real o que está sendo feito usando cat foo". Também pode ser usado para monitorar quando um programa está aguardando entrada ou concluído, por exemplo, monitorando o registro de data e hora do fifo.
sudodus 3/01