Wie kann man die Ausgabe einer Befehlszeile auf der Konsole anzeigen und die Ausgabe in einer Textdatei speichern?

25

Wie kann ich BEIDE ausführen, sudo apt-get installum den Installationsprozess zu sehen (in meinem Fall lang) und die Ausgabe in einer Textdatei zu speichern?


quelle
Ist nur ungefähr apt-getrichtig?
Braiam
@Braiam Ich denke, die von mir akzeptierte Lösung kann auf alle anderen Befehle angewendet werden, meinst du?

Antworten:

17

benutze den scriptBefehl. Es kopiert alles, was in einer Datei angezeigt wird

script -c "sudo apt-get install things" script-file.script
exore
quelle
scriptSendet die Befehlsausgabe an eine Datei, zeigt sie jedoch nicht auf dem Bildschirm an.
Aaron
2
@ BryceAtNetwork23. Hast du den Befehl ausprobiert? Skript tut Sende Ausgabe auf dem Bildschirm.
Exore
1
Ich tat. Ich lief script -c "history" ~/hist.txtund sah die Ausgabe, die Script startedund anzeigt Script done, aber ich sah nicht die Ausgabe des tatsächlichen Befehls auf dem Bildschirm.
Aaron
10
@ BryceAtNetwork23 historyist eine eingebaute Shell, kein externer Befehl. Was passiert ist: 1) Skript startet, 2) Skript durchsucht den Verlaufsbefehl, findet ihn nicht, daher wird vermutet, dass es dies über eine Shell ausführen sollte. 3) Das Skript führt den Befehl history über eine Shell aus. 4) Eine neue Shell wird gestartet und führt den internen Verlaufsbefehl aus. Da dies eine neue nicht interaktive Shell ist, hat die Geschichte nichts zu sagen.
Exore
1
scriptkann auch interaktiv ausgeführt werden. Geben Sie einfach scriptan der Eingabeaufforderung ein. Sie erhalten eine neue Shell und bei jedem Befehl, den Sie eingeben, wird die Ausgabe gespeichert. Geben Sie ein exit, um die Shell zu beenden und die Datei zu speichern. Standardmäßig wird die Ausgabe aufgerufen typescriptund enthält alles, was auf Ihrem Bildschirm angezeigt wird, unabhängig davon, ob Sie es eingegeben haben oder ob es sich um die Ausgabe eines Befehls handelte. Der historyBefehl sollte auch in der neuen Shell noch verfügbar sein.
Brian Minton
52

Sie können den teeBefehl verwenden, um dies zu erreichen.

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

Schau hier für mehr Infos , oder führe ausman tee

Hinweis: Wie bereits erwähnt, 2>&1muss STDERR nach STDOUT umgeleitet werden, um Fehler abzufangen. In dieser StackOverflow-Frage finden Sie eine gute Erklärung der 2>&1tatsächlichen Funktionsweise.

Aaron
quelle
Ich würde "2> & 1" vor dem "|"
Olivier Dulac
2
Dies ist praktischer als, scriptda der Befehl nicht in Anführungszeichen gesetzt werden muss. So lassen sich Vorteile wie die Bash-Vervollständigung leichter erzielen.
Dan
2
@Dan: script benötigt das -c "something ...": if nicht, dann werden Sie auf eine Shell umgeleitet und beendet, wenn Sie diese Shell beenden . Ermöglicht mehrere Befehle usw. Außerdem bleiben mehr "Formatierungs" -Infos erhalten, wodurch einige weitere Dinge (wie: Bildschirm löschen usw.) wiedergegeben werden können (dies kann jedoch auch die Ausgabe durcheinander bringen ... ymmv)
Olivier Dulac
2
@Dan + arbeitet mit Funktionen, Aliasen, Builtins und sogar Befehlsgruppen und Subshells. Dies sollte die akzeptierte Antwort IMO sein.
Darkhogg
1
Sie könnten |&anstelle von 2>&1 |in Bash
jfs
15

tee erledigt die Arbeit nach Bedarf.

Verwenden Sie zum Erfassen der Ausgabe in eine Datei Folgendes:

sudo apt-get install your_software | tee log_file.txt

Dadurch wird nur die Ausgabe erfasst, jedoch keine Fehlermeldung. Wenn Sie auch Fehlermeldungen aufzeichnen möchten, ändern Sie den Befehl wie folgt:

sudo apt-get install your_software 2>&1  | tee log_file.txt
Alex C
quelle
Oder leiten Sie, da bash der |&Operator dies unterstützt , sudo apt-get install your_software |& tee log_file.txtsowohl stdout als auch stderr an tee. (Ein großes Lob an JF Sebastian, der dies an anderer Stelle vorgeschlagen hat .)
Eliah Kagan
9

Das Schöne an apt-get (und APT im Allgemeinen) ist, dass sie Protokolldateien für fast alles speichern, selbst für die Terminalausgabe aller Befehle, die Sie in der Anwendung ausführen /var/log/apt. Dies ist zum Beispiel der letzte Eintrag in meinem /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

Nun zum Vergleich mit der tatsächlichen Ausgabe:

➜  ~  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) ...

Es hat mir mehrere Zeilen erspart, die in den meisten Fällen nicht relevant sind, und das geschieht automatisch. Sie benötigen also keinen zusätzlichen Befehl, um das zu tun, was Sie tun möchten. Apt-get erledigt dies für Sie.

Braiam
quelle
1

versuche den tee Befehl. Sie können finden hier einige Beispiele.

Einfache Bedienung:

  <command> | tee file

Beispiel:

  sudo apt-get install whatYouWant | tee outputFile
Lety
quelle