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
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-linuxscript
)
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.
2>&1
>
invece di tee ed è per questo che ho condiviso lopzione per tee.