Come visualizzare l'output di una riga di comando sulla console e salvare l'output in un file di testo?


25

Come posso eseguire sudo apt-get installdalla SIA vedere il processo di installazione (a lungo nel mio caso) e salvare il suo output in un file di testo?


È solo apt-getgiusto?
Braiam,

@Braiam Penso che la soluzione che ho accettato possa essere applicata a tutti gli altri comandi, pensi di sì?

Risposte:


17

usa il scriptcomando Copia tutto ciò che va sullo schermo in un file

script -c "sudo apt-get install things" script-file.script

scriptinvia l'output del comando a un file, ma non lo mostra sullo schermo.
Aaron,

2
@ BryceAtNetwork23. Hai provato il comando? lo script fa in uscita verso lo schermo.
Exore,

1
L'ho fatto. Ho corso script -c "history" ~/hist.txte ho visto l'output che indica Script startede Script done, ma non ho visto l'output del comando effettivo sullo schermo.
Aaron,

10
@ BryceAtNetwork23 historyè una shell incorporata, non un comando esterno. Quello che succede è: 1) lo script viene avviato, 2) lo script cerca il comando history, non lo trova, quindi suppone che dovrebbe essere eseguito tramite una shell. 3) lo script esegue il comando history tramite una shell 4) avvia una nuova shell ed esegue il comando interno della cronologia. Poiché si tratta di una nuova shell non interattiva, la storia non ha nulla da dire.
Exore,

1
scriptpuò anche essere eseguito in modo interattivo. Basta digitare scriptal prompt dei comandi. Otterrai una nuova shell e tutti i comandi digitati avranno il loro output salvato. Digitare exitper terminare la shell e salvare il file. Per impostazione predefinita, l'output viene chiamato typescripte conterrà tutto ciò che viene visualizzato sullo schermo, sia che sia stato digitato, sia che fosse l'output di un comando. Il historycomando dovrebbe essere ancora disponibile anche nella nuova shell.
Brian Minton,

52

È possibile utilizzare il teecomando per eseguire ciò.

sudo apt-get install someapp 2>&1 | tee ~/someappInstall.txt

Cerca qui per maggiori informazioni o eseguiman tee

Nota: come altri hanno già detto, 2>&1è necessario reindirizzare STDERR a STDOUT per rilevare eventuali errori. Vedi questa domanda StackOverflow per una buona spiegazione di ciò che 2>&1effettivamente fa.


Aggiungerei "2> & 1" prima di "|"
Olivier Dulac,

2
Questo è più pratico rispetto a scriptquando il comando non deve essere citato. Quindi vantaggi come il completamento della bash sono più facili da realizzare.
Dan,

2
@Dan: lo script non ha bisogno di -c "something ...": se poi ti lascerà su una shell e finirà quando esci da quella shell. Consente più comandi, ecc. Inoltre mantiene più informazioni di "formattazione", consentendo la riproduzione di alcune altre cose (come: cancella schermo, ecc.) (Ma che può anche rovinare l'output ... ymmv)
Olivier Dulac

2
@Dan + funziona con funzioni, alias, builtin e persino gruppi di comandi e subshells. Questa dovrebbe essere la risposta accettata IMO.
Darkhogg,

1
potresti usare al |&posto di 2>&1 |bash
jfs il

15

tee farà il lavoro come richiesto.

Per acquisire l'output in un file, utilizzare:

sudo apt-get install your_software | tee log_file.txt

Questo acquisirà solo l'output, ma non eventuali messaggi di errore. Se si desidera anche registrare messaggi di errore, modificare il comando in modo che sia:

sudo apt-get install your_software 2>&1  | tee log_file.txt

Oppure, dal momento che bash supporti l' |&operatore , sudo apt-get install your_software |& tee log_file.txttubo di volontà sia stdout e stderr a tee. (Complimenti a JF Sebastian che lo ha suggerito altrove .)
Eliah Kagan

9

Una delle bellezze di apt-get (e APT in generale) è che memorizzano i file di registro per quasi tutto, anche l'output del terminale di qualsiasi comando che si esegue, attraverso /var/log/apt. Ad esempio, questa è l'ultima voce nel mio /var/log/apt/term.log:

Log started: 2014-06-20  16:46:08
(Reading database ... 252472 files and directories currently installed.)
Removing xdotool (1:3.20130111.1-3.1) ...
Processing triggers for man-db (2.6.7.1-1) ...
Log ended: 2014-06-20  16:46:33

Ora, confrontando con l'output effettivo:

➜  ~  sudo apt-get remove xdotool 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  libxdo3
Use 'apt-get autoremove' to remove it.
The following packages will be REMOVED:
  xdotool
0 upgraded, 0 newly installed, 1 to remove and 2 not upgraded.
After this operation, 135 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 252472 files and directories currently installed.)
Removing xdotool (1:3.20130111.1-3.1) ...
Processing triggers for man-db (2.6.7.1-1) ...

Mi ha salvato diverse righe che non sono rilevanti nella maggior parte dei casi, e lo fa automaticamente. Quindi, non hai bisogno di alcun comando aggiuntivo per fare quello che vuoi fare, apt-get lo fa per te.


1

prova il comando tee . Puoi trovare qui alcuni esempi.

Semplice utilizzo:

  <command> | tee file

esempio:

  sudo apt-get install whatYouWant | tee outputFile
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.