Wie speichere ich alle Befehlsausgaben und Fehler?

425
Alex Bender

Hallo!

Ich muss alle Befehle, Stdout und Stderr erfassen, ohne die Befehle zu ergänzen.
Ich meine, dass ich die Ausgabe davon speichern / speichern muss:

  1. $ echo 'test'
  2. $ ls -l
  3. $ cat some_file

Befehlsdatei

  1. alex @ bender: / pwd $ echo 'test'
  2. alex @ bender: / pwd $ ls
  3. alex @ bender: / pwd $ cat some_file
  4. alex @ bender: / pwd $ fsdfsdfsd

stdout.file

  1. Prüfung
  2. test.txt einige_Datei
  3. etwas Dateiinhalt

stderr.file

_4. fsdfsdfsd

Für den ersten Teil der Frage habe ich ein Skript gefunden, das einen Trap verwendet. Bevor der Befehl ausgewertet wird, speichert er den zu protokollierenden Befehl. Aber was ist mit dem Speichern der Ausgabe? Wiederholung: Dies sollte gelöst werden, ohne dass der Befehl hinzugefügt wurde. Ich meine, nach dem Ausführen des Skripts muss ich nicht schreiben, zum Beispiel zuerst den Befehl ls > log.file. Ich möchte es ohne " > log.file " sehen.

Ich schreibe ein Python-Skript, es funktioniert wie ein Befehlswrapper.

if name == ' main ':
user = os.getlogin ()
Computername = os.uname () [1]

stdinbuff = open('commands', 'w')  stdoutbuff = open('outs', 'w')   command_string = 1  while command_string != '0':   a = user + '@' + machine_name + ":" + os.getcwd() + '>';  a = a.replace('/home/', '~/')  print a,  command_string = raw_input()  command_args = command_string.split()   proc = subprocess.Popen(command_args, stdout=subprocess.PIPE)  (out, err) = proc.communicate()  print out   stdinbuff.write(command_string+'\n')  stdoutbuff.write(out+'\n')   stdinbuff.close()  stdoutbuff.close() 

In diesem Wrapper kann ich jedoch keine automatische Vervollständigung wie in Bash verwenden, und dieses Skript kann nicht alles speichern, was ich möchte.

Vielleicht könnte mir jemand sagen, was ich tun muss?

3

2 Antworten auf die Frage

1
noggerl

Vielleicht kann das screenTool mit der Bildschirmprotokollierungsfunktion den Trick für Sie erledigen. Beginnen Sie einfach screenin der Kommandozeile und mit den Tasten CTRL-a + H(zuerst Kombination CTRL + aund dann ein Großbuchstabe H mit SHIFT + H, nur zur Klarstellung) wird alles in der Datei protokolliert screenlog.0. Das Verzeichnis, in dem sich die Protokolldatei befindet, hängt davon ab, wo Sie den Bildschirm gestartet haben. Wenn Sie also den Bildschirm in $ HOME gestartet haben, wird die Protokolldatei dort gefunden.

Tolle Lösung! Vielleicht möchten Sie klarstellen, dass "A" nur der Schlüssel "a" ist, aber "H" bezieht sich auf ein Kapital "H". Die Kombination wird also effektiv zu "CTRL-A" und dann zu "SHIFT-H". Tim vor 10 Jahren 0
Danke ** noggerl **, aber vielleicht wissen Sie einen anderen Weg, dies zu tun, weil ich irgendwann die Ausgabe flicken muss. Alex Bender vor 10 Jahren 0
Die einzige Lösung, die mir dabei einfällt, ist der Start eines zweiten "Bildschirms". In diesem "Bildschirm" können Sie ein Skript starten, das die Ausgabe des anderen "Bildschirms" zur Laufzeit korrigiert (dh in Python könnte ein Shellscript dies tun). Vielleicht kann ich Ihnen noch ein bisschen helfen, wenn Sie mir sagen, was Sie versuchen. @Tim: danke für deinen Hinweis, ich habe meine Lösung mit deinen Vorschlägen bearbeitet. noggerl vor 10 Jahren 0
1
Alex Bender