Cattura tutto loutput di uno script in un file (dallo script stesso) [duplicate]

Questa domanda ha già una risposta qui :

Commenti

  • Per quelli che finiscono qui da Google, potresti anche prendere in considerazione questa risposta ( unix.stackexchange.com/a/164017/103505 ) per inserire tutto il codice si desidera eseguire loutput in una funzione nello script e quindi reindirizzare loutput di quella funzione.

Answer

Un metodo che ho trovato per acquisire tutto loutput da qualsiasi sessione è avviare una nuova sessione di bash e inserire un file di registro. è davvero utile per monitorare più di uno script.

 bash | tee ~/bash.log #this will save standard output until the bash session is ended bash | tee ~/bash.log 2>&1 #this will save all output including errors until the bash session is ended 

oppure puoi semplicemente inserire lo script stesso

./myscript.sh | tee ./myscript.log #this will log only the output of the script.

Commenti

  • La tua soluzione si rivolge a STDOUT, ma non a STDERR
  • Ho inserito un esempio con 2>&1
  • Non ' penso che questo risponda alla domanda perché il requisito n. 1 era " eseguito ./myscript.sh senza costrutti di shell aggiuntivi ".
  • Questa domanda è stata modificata 6 ore fa, io non ' non disponevo di queste informazioni quando ho risposto per la prima volta alla domanda. Utilizzava loutput > invece di tee ed è per questo che ho condiviso lopzione per tee.

Risposta

Puoi sempre invocare script allinterno di uno script per registra tutto.

Come stampare e registrare tutto allo stesso tempo in uno script bash in log.txt:

Visualizzazione del registro log.txt:

$ ./a.sh Script started, output file is log.txt teste Script done, output file is log.txt $ cat log.txt Script started on Fri Feb 16 17:57:26 2018 command: /bin/bash -c ./a.sh teste Script done on Fri Feb 16 17:57:26 2018 

Commenti

  • Se ho capito bene (alcune spiegazioni potrebbero aiutare :), lo script sta cercando di rilevare se ' è in esecuzione con script e non si esegue nuovamente. A partire da Ubuntu 20, sembra che $SCRIPT non sia impostato, quindi lo script va in un ciclo infinito.
  • Buona idea usare script però, poiché consente loutput del terminale interattivo, ad es Ritorno in carrozza, al lavoro. In effetti, i comandi che visualizzano loutput di avanzamento su una sola riga (ad esempio gli archiviatori), si comportano normalmente . Per quanto riguarda la risoluzione del problema del ciclo infinito, possiamo testare il livello della shell : if (( $SHLVL < 3 )); then script...; fi.
  • Inoltre, gli argomenti degli script finiscono per essere concatenati e passati nellargomento codice alla shell avviata da script (non /bin/bash, quellargomento /bin/bash viene ignorato con util-linux script)

Risposta

Desideri utilizzare tee .

Es:

echo "Hello World" | tee out.txt 

Questo crea un file out.txt con loutput del comando e lo stampa sullo schermo. Usa “tee -a filename” se vuoi aggiungere al file.

echo "Hello" | tee -a out.txt echo "World" | tee -a out.txt 

out.txt avrà due righe Hello e World (senza -a avrebbe solo world)

Se vuoi salvare lintero script e generare lintero script:

./script.sh | tee output.txt 

Commenti

  • La tua soluzione si rivolge a STDOUT, ma non a STDERR
  • unix.stackexchange.com/a/61932/268823 spiega come eseguire STDOUT e STDERR
  • Non ' penso che questo risponda alla domanda perché il requisito n. 1 era " esegui ./myscript.sh senza costrutti di shell aggiuntivi ".
  • Immagino che un modo per farlo sarebbe per mettere tutto in una funzione e usare tee alla fine. Ciò funzionerebbe efficacemente come inizio e fine cattura. E reindirizzare STDERR se questa è lintenzione.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *