Come reindirizzare l'output sullo schermo e su un file?


12

Il mio obiettivo è di registrare tutto l'output di uno script in una directory che lo script sta per creare.

Ad esempio, ho:

~/.abc.sh:

#! /bin/bash
rails new myapp

Quando corro ...

cd ~/code
. ~/.abc.sh

... che creerà una nuova app Rails nella directory ~/code/myapp.

Quando Rails sta creando un'app, genera un sacco di testo che voglio catturare e archiviare in un file di registro nella stessa directory del railscomando appena creato. Voglio anche visualizzare quel testo anche nel terminale.

Come procedo a fare questo?

Risposte:


23

È possibile utilizzare il teecomando per quello:

command | tee /path/to/logfile

L'equivalente senza scrivere sulla shell sarebbe:

command > /path/to/logfile

Se vuoi aggiungere ( >>) e mostrare l'output nella shell, usa l' -aopzione:

command | tee -a /path/to/logfile

Si noti che la pipe catturerà solo stdout, gli errori su stderr non vengono elaborati dalla pipe con tee. Se si desidera registrare errori (da stderr), utilizzare:

command 2>&1 | tee /path/to/logfile

Ciò significa: eseguire commande reindirizzare il flusso stderr (2) su stdout (1). Quello verrà passato al tubo con l' teeapplicazione.


Intendi ~/.abc.sh | tee <file>? In tal caso, il problema è che non so in quale directory lo script creerà l'app quando la chiamo, quindi come faccio a sapere cosa dare filenell'argomento? (Grazie per i grandi esempi)
Zabba,

@Zabba: che ne dici di creare un file temporaneo e spostarlo in seguito?
Lekensteyn,

Ok, dovrebbe funzionare :). A tale proposito, come faccio a creare un file temporaneo con un nome casuale che posso quindi inviare in output e quindi copiare in una posizione desiderata in seguito? Esiste un comando integrato per ottenere un "nome file temporaneo"?
Zabba,

@Zabba: il comando è quello mktemp. Vedi la pagina del manuale man mktemp.
Lekensteyn,

跪拜, lavora come un incantesimo
Sun Junwen l'

0

scriptavvierà una sessione interattiva e registrerà tutto l'output (stdout / stderr ecc.) su un file o (con il -cparametro) eseguirà un comando e registrerà l'output di quello.

script -c ~/.abc.sh -f abc.log

Nota: in una sessione interattiva, è possibile interrompere la registrazione semplicemente uscendo dalla sessione come si farebbe normalmente (ad es. exitO Ctrl-D).

Per la registrazione di sessioni con riproduzione video, puoi anche provare asciinema .

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.