Esiste un modo semplice per registrare tutte le attività eseguite da uno script di shell?


18

C'è un modo semplice per registrare tutte le attività che si verificano da uno script di shell in un file?

Ho una sceneggiatura. Emette cose come "istruzioni" echo, così come altri output del programma. Conosco i comandi:

command | tee -a "$log_file"

e

command >> logifle.log

Quello che sto chiedendo è se esiste un parametro shell per la registrazione, o un comando set che posso usare o qualcosa del genere. Non voglio necessariamente aggiungere dozzine di reindirizzamenti o tee ai file se non devo. Voglio comunque ottenere l'output std - voglio solo che sia registrato .:wq


5
LOL: wq come se fossi in vim '
j0h

1
mi fa pensare che la maggior parte della gente sembra farlo invece di: x
Scusarsi e reintegrare Monica il

Risposte:


18

se normalmente esegui lo script con foo.sh, prova a eseguirlo (supponendo che sia uno script bash) con bash -x foo.sh. Se vuoi che tutto venga reindirizzato su file, prova bash -x foo.sh > file.log 2>&1(nota che sto reindirizzando anche stderr, rimuovilo 2>&1se non lo desideri). Se anche voi volete vedere che cosa sta succedendo, bash -x foo.sh 2>&1 | tee log.file.


20

C'è un modo molto semplice e pratico:

Usando per scriptscrivere dattiloscritto della sessione terminale

  1. Avvia il comando script

    Se fileviene fornito l'argomento , ad esempio script ~/tmp/output, scriptsalva il dialogo in questo file. Se non viene fornito alcun nome file, la finestra di dialogo viene salvata nel filetypescript

  2. Inizia la tua sceneggiatura o qualsiasi cosa tu voglia iniziare

  3. Se lo script è terminato, interrompere scripttramite Ctrl-D

  4. Controllare l'output nel file di output predefinito typescript


Per avviare il comando in un solo passaggio script, utilizzare il parametro-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.

L'uso di scriptall'interno del tuo script non ha senso perché crea una scriptshell o avvia una nuova shell.

Se esiste la variabile SHELL, la shell biforcuta dallo script sarà quella shell. Se SHELL non è impostato, si assume la shell Bourne. (La maggior parte delle shell imposta questa variabile automaticamente).


4
@Fabby Mi piace la mia risposta, ma non vedo la piccola cosa grigia;)
AB

Lo uso script logfilename, quindi posso prenderlo.
Waltinator,

posso chiamare "script" dal mio programma shell?
j0h

1
Questo non ha senso, vedi la mia risposta migliorata.
AB

1
+1. Grazie per questa risposta :-) scriptè utile anche un monitoraggio via fifo. Da man script: " -f, --flushSvuota l'output dopo ogni scrittura. È utile per il telecooperamento: una persona lo fa mkfifo foo; script -f fooe un'altra può controllare in tempo reale ciò che viene fatto usando cat foo". Può anche essere usato per monitorare quando un programma è in attesa di input o fatto ad esempio monitorando il timestamp del fifo.
sudodus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.