Entschuldigung für den verwirrenden Titel!
Angenommen, ich renne
apt-cache depends kde-window-manager > ~/Desktop/kwin-depends
Ich erhalte eine Datei mit dem Namen "kwin-dependant" in meinem Desktop-Ordner.
Gibt es einen Trick, um den Befehl, den ich als Teil der Datei ausgegeben habe, vorzugsweise am Anfang der Datei einzuschließen?
Zumindest in 14.04 LTS würden die ersten paar Zeilen so aussehen:
apt-cache depends kde-window-manager > ~/Desktop/kwin-depends
kde-window-manager
Depends: kde-runtime
Depends: libc6
|Depends: libegl1-mesa
Depends: <libegl1-x11>
Statt einfach so:
kde-window-manager
Depends: kde-runtime
Depends: libc6
|Depends: libegl1-mesa
Depends: <libegl1-x11>
command-line
bash
Gerechtigkeit für Monica
quelle
quelle
Antworten:
Ich würde nur eine einfache Funktion verwenden. Fügen Sie dies zu Ihrer
~/.bashrc
Datei hinzu:Wenn Sie jetzt einen Befehl ausführen und ausdrucken möchten, können Sie Folgendes tun:
Das Obige erzeugt diese Datei:
quelle
apt-cache depends
zum Beispiel einen Alias für habeacd
, erhalte ich beim Ausführen "Kein Befehl 'acd' gefunden, meinten Sie: ..."runcom acd leafpad > out
.ls
istls --color=auto'
in der Realität aliasiert . Was Sie tun können (solange es keine einzelne oder doppelte Anführungszeichen in Ihrem Alias ist), dann ist dies:$ terdonsFunction $(alias ls | awk -F '=' '{$1="";print}'| tr "'" " ")
.MYCOMMAND="apt-cache depends"; terdonsFunction $MYCOMMAND leafpad > out.txt
Du kannst tun:
Das Gleiche mit
echo
anstelle von Here strings (<<<
):tee
schreibt in STDOUT und auch in die Dateifile.txt
Der STDOUT von
tee
ieapt-cache depends kde-window-manager
wird eingespeist,bash
um den Befehl auszuführen und den STDOUT anzufügenfile.txt
.Beispiel:
quelle
tee
aber meiner ist immer wieder gescheitert. Gut gemacht! +1tee
scheint ordentlich :)Am minimalistischsten - Ansatz Nr. 4 und Nr. 3, beide könnten in Funktion umgewandelt werden; # 2 mein Favorit -
awk
. Nr. 1 verwendetscript
Befehl - ein sehr vielseitiges Tool, das für die Aufzeichnung von Befehlszeilen im Allgemeinen nützlich ist. überall einsetzbar, für alles, was Sie aufnehmen möchten.Ansatz Nr. 1: Es gibt einen
/usr/bin/script
Befehl (der standardmäßig mit ubuntu geliefert wird) für die Aufzeichnung der Befehlszeilenausgabe, der zusammen mit der Eingabeaufforderung und dem Befehl alles erfasst. Um nur einen Befehl und seine Ausgabe in einer bestimmten Datei zu speichern, verwenden Sie-c
flag und geben Sie die Ausgabedatei an. BeispielAnsatz Nr. 2: awk hackery
Awk hat eine
system()
Funktion, mit der Sie Shell-Befehle über einawk
Skript oder einen Befehl ausführen können . Die Ausgabe wird auf dem Bildschirm angezeigt, Befehl zuerst, Ausgabe als nächstes. Um das, was Sie sehen, in eine Datei umzuleiten, verwenden Sie>
Operator.Dies kann auf zwei Arten erfolgen: Bitten Sie den Benutzer, Daten über stdin oder als Befehlszeilenargument einzugeben. Erstens ist es einfacher, dies zu erreichen, weshalb es veröffentlicht wird.
(1)
awk 'BEGIN{ print "Enter command to run: "; getline com < "/dev/stdin"; system(com) }'
(2) Befehlszeilen-Args-Version; Ohne Ausgabe, um zu vermeiden, dass die Antwort zu lange dauert. Wieder anhängen
>
, um zur Datei umzuleitenAnsatz 3: Bitten Sie bash, den Job für Sie zu erledigen
Weiterleitung zur Datei mit
>
Operator:bash -c ' MYCOMMAND="apt-cache depends gnome-terminal"; echo $MYCOMMAND ; $MYCOMMAND ' > output.txt
Ansatz 4: (mein zweiter Favorit)
Inspiriert von ByteCommanders Beitrag; Wir können
read
die erforderlichen Befehle in der Subshell verwenden und dann ausführenProbelauf:
Ansatz 5:
Verwenden Sie
echo
oderhere string
(aka<<< "string"
), um Argumente fürsh -c
through bereitzustellenxargs
Und wenn Sie möchten, können Sie diesen Trick auch mit einem Alias verwenden:
quelle
awk
wirklich ein sehr konfigurierbarer kleiner Kerl, nicht wahr? `script sieht auch für ein paar andere Zwecke praktisch aus.script -q outputfile
outputfile
Beispiel
Start
script
Starten Sie Ihren Befehl
Presse Ctrl-D
Zeigen Sie Ihren Befehl und Ihre Ausgabe
und du wirst so etwas sehen
quelle
Wenn Sie eine Alias-Erweiterung (nur Bash) wünschen, können Sie dies folgendermaßen tun:
Du kannst jetzt rennen
quelle
Möglicherweise gibt es einen einfacheren Weg, aber Sie können dies mit einem Skript tun:
Erstellen Sie eine Datei
script
mit diesem Inhalt in Ihrem Basisordner und erteilen Sie die AusführungsberechtigungFühren Sie es so aus:
quelle
script.sh
immer eine Datei erstellt wird, diescript.log
mit ihrer Ausgabe aufgerufen wird.Extrem einfache Lösung mit einzeiliger Bash-Funktion
Vorbereitung:
Bei diesem Ansatz wird eine benutzerdefinierte Bash-Funktion verwendet, um die gewünschte Funktionalität bereitzustellen. Sie definieren es, indem Sie die folgende Zeile in Ihrer Terminalsitzung ausführen. Beachten Sie, dass Sie anstelle von
runandlog
: einen gültigen Namen für die Bash-Variable wählen können.Dies bleibt jedoch nur für die aktuelle Bash-Sitzung bestehen, dh nach dem Schließen des Terminalfensters ist die Funktion nicht mehr verfügbar.
Wenn Sie es dennoch versucht und gemocht haben, können Sie es jederzeit verfügbar machen, indem Sie Ihre
~/.bashrc
Datei bearbeiten und diese Zeile an das Ende anhängen.Wie benutzt man:
Nachdem Sie die Funktion definiert haben, können Sie sie zum Ausführen von Befehlen verwenden, während Sie den Befehl selbst und seine Ausgabe in einer Datei protokollieren. Sie können sogar weitere Informationen hinzufügen, z. B. den Benutzer, der sie ausgeführt hat, den ich bereits in die Funktion aufgenommen habe, oder die genaue Uhrzeit, zu der sie ausgeführt wurde. Feature-Wünsche in Kommentaren sind willkommen! :)
Die Syntax ist einfach:
Beispiel:
Eine Beispielsitzung als Benutzer
bytecommander
, die über das Basisverzeichnis ausgeführt wird, könnte folgendermaßen aussehen:Was dazu führt, dass im aktuellen Verzeichnis eine neue Datei mit folgendem Inhalt erstellt
mylogfile
wird (falls diese bereits vorhanden ist, hängt die Funktion die Ausgabe an!) :quelle
Ein ziemlich schlechter, aber funktionaler Trick wäre:
Hässlich, aber es funktioniert!
quelle
Sie können den Befehl einfach an eine Funktion übergeben, die zuerst den Befehl und anschließend die Ausgabe des Befehls druckt. (Die Umleitungen werden absichtlich nicht in den gedruckten Befehl übernommen. Sie können dies leicht ändern, indem Sie die Anführungszeichen aus dem Befehl entfernen und
$@
stattdessen drucken und ausführen von$1
in der Funktion):Um den Befehl später hinzuzufügen, können Sie diesen Befehl ausführen, der den zuletzt ausgeführten Befehl am Anfang einer Datei einfügt:
<<<"[...]"
: hier Zeichenfolge;[...]
wird weitergeleitet zucat
'sstdin
;$(<foo)
: Befehlsersetzung; Es wird durch den Inhalt von "foo" ersetzt.cat [...] - >foo
: verkettetstdin
zu[...]
und gibt zu "foo" aus;<([...])
: Prozessersetzung: wird durch einen Dateideskriptor ersetzt, der die Ausgabe von enthält[...]
;history 2 | sed -n '1s/ [0-9][0-9]* \(.*\)/\1\n/p'
: gibt die letzten beiden Befehle aus, entfernt zwei Leerzeichen, gefolgt von einer oder mehreren Ziffern, gefolgt von zwei Leerzeichen in der ersten Zeile und druckt sie aus;quelle
$1
? Und es gibt keine Notwendigkeit dafüreval
.eval
nicht nötig, nicht sicher warum ich es vorher hinzugefügt habe. Vielen Dank.