Wie bekomme ich schnell die vorherige Zeilenausgabe in einem Terminal, ohne eine Maus zu benutzen?

13

Linux (zB Ubuntu) Terminal, gibt es eine Methode, um die letzte Zeile zu bekommen? Angenommen, ich tippe nach dem Zufallsprinzip einen tdBefehl ein, der nicht auf meinem System installiert ist, und erhalte eine Meldung wie die folgende. Ich hätte gerne eine "Verknüpfung", um sudo apt-get install textdrawschnell zu laufen .

Gibt es so ein Tool oder wie kann ich die letzte Zeile ohne die Maus in die Zwischenablage kopieren?

username@WorkStation:~$ td
The program 'td' is currently not installed. You can install it by typing:
sudo apt-get install textdraw
username@WorkStation:~$
Daniel
quelle
Drücken Sie den Aufwärtspfeil? Hast du das versucht? Schauen Sie sich auch den Befehl history unter Linux an, der möglicherweise auch für Sie funktioniert.
Richie086
Terminal-Multiplexer-Programme, tmux und screen, bieten die Möglichkeit, Text in eine Zwischenablage zu kopieren. Es könnte jedoch einen einfacheren Weg in Ubuntus Standard-GUI geben, so dass ich vermute, dass eine einfachere Antwort verfügbar ist. Durch Drücken von PgUp, Shift-PgUp oder Ctrl-PgUp können Sie möglicherweise einen Bildlauf durchführen.
TOOGAM
3
@ Richie086 Bitte beachte, was ich brauche, ist sudo apt-get install textdrawnicht td. Pfeil nach oben gibt mir nur dietd
Daniel

Antworten:

6

Wenn dir ein bisschen Obszönität nichts ausmacht (ich nicht), solltest du vielleicht den Fick verwenden , ein Tool, das genau das tut, wonach du gefragt hast.

Nun, nicht genau, aber es löst das gleiche Problem. Anstatt nur die letzte Zeile abzurufen, wird versucht, mit dem zuletzt eingegebenen Befehl übereinzustimmen.

The Fuck versucht, eine Regel für den vorherigen Befehl abzugleichen, erstellt einen neuen Befehl unter Verwendung der abgeglichenen Regel und führt ihn aus.

Die im Repository gezeigten Beispiele zeigen einige der von Ihnen erwähnten Szenarien.

Bildbeschreibung hier eingeben

Alpha
quelle
2

Die kurze Antwort: Nein, wahrscheinlich haben Sie keine verfügbare Methode, um dies zu tun.

Die lange Antwort:

  • Während es möglich ist , einen Terminal-Emulator zu haben, mit dem Sie den Bildschirminhalt "nur" zurücklesen und bearbeiten können, geschieht dies in der Praxis nicht oft, da befürchtet wird, dass unerwünschte Programme Ihre Tastatureingaben stören könnten.
  • eine Schale könnte Capture die Ausgabe Ihrer Befehle ausgelegt und ermöglicht es Ihnen , zu bearbeiten , dass (wie Ihr Befehl Geschichte). Es würde kompliziert werden, wenn der Befehl so etwas wie vi(bei der Ausgabe ist kein schöner zeilenorientierter Text) wäre. bash macht das sowieso nicht.

In der Praxis besteht das Problem darin, andere Programme zu verwenden, um die Befehlsausgabe zu erfassen und zu bearbeiten. Aber es wird Ihr unmittelbares Problem nicht lösen.

Zum Beispiel verwende ich vi-like-emacs , um Ad-hoc-Shell-Befehle auszugeben. Wenn für diese keine weiteren Eingaben erforderlich sind, empfiehlt es sich, diese in einem Fenster auszuführen , die Ausgabe des Befehls zu erfassen und die Ausgabe nach Bedarf zu bearbeiten, um den Befehl zu verfeinern. Mit Emacs können Sie auch so etwas tun, genauso wie mit vim.

Thomas Dickey
quelle
2

Wenn Sie diese Meldung in Ubuntu erhalten haben, nachdem Sie einen nicht vorhandenen Befehl von Bash ausgeführt haben, verwendet Ihr System wahrscheinlich die command_not_found_handleFunktion. Sie können es in sehen /etc/bash.bashrc.

Ein triviales Hacken kann eine Option sein: Ich habe gerade ein Skript mit dem Namen erstellt cnfh:

#!/bin/bash

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
        function command_not_found_handle {
                # check because c-n-f could've been removed in the meantime
                if [ -x /usr/lib/command-not-found ]; then
                   /usr/lib/command-not-found -- "$1"
                   return $?
                elif [ -x /usr/share/command-not-found/command-not-found ]; then
                   /usr/share/command-not-found/command-not-found -- "$1"
                   return $?
                else
                   printf "%s: command not found\n" "$1" >&2
                   return 127
                fi
        }
fi


"$@"
RET_VAL=$?
if [ $RET_VAL -eq 127 ]; then
  OUT=$(command_not_found_handle "$@" 2>&1)
  $(echo $OUT |sed -n 's/.*\(apt-get install .\+\)$/\1/p')
fi

Führen Sie dann den Befehl td mit folgendem Skript aus:

# ./cnfh td

Verwenden von Ubuntu 14.04.2 LTS . Ich hoffe das hilft.

Kadir
quelle
Das sieht wirklich cool aus und vielleicht möchte ich etwas zu meinem System hinzufügen. Könnten Sie einige Informationen darüber hinzufügen, wie es funktioniert? Der eingebaute Code für die Bearbeitung von Abschlüssen und ähnlichen Dingen ist ziemlich schwer zu verstehen.
Joe
2

In tmux v2.4 und höher (seit diesem Commit https://github.com/tmux/tmux/commit/76d6d3641f271be1756e41494960d96714e7ee58 ) mit send-keys -X. Möglicherweise ist dies in älteren Versionen mit einer anderen Syntax möglich.

In .tmux.conf:

bind ! copy-mode \;\
       send-keys -X cursor-up \;\
       send-keys -X select-line \;\
       send-keys -X cursor-left \;\
       send-keys -X copy-selection-and-cancel \;\
       paste-buffer

Kopiert prefix+!nun die letzte Zeile an die aktuelle Cursorposition.

cursor-left kann weggelassen werden, wenn Sie es direkt ausführen möchten, ohne return einzugeben.

Hinweis : Es funktioniert nicht, wenn die letzte Zeile leer oder umbrochen ist, aber es ist in den meisten Fällen trotzdem nützlich

lbonn
quelle
0

Wenn Sie die letzte Ausgabezeile des letzten Befehls ausführen möchten, führen Sie diesen Befehl erneut aus (da er nur eine Diagnosemeldung enthält)

$($(fc -ln -1) | tail -n 1)

Schritt für Schritt (Schicht für Schicht):

  • fc (was möglicherweise für „Befehl reparieren“ steht) ist ein in die Shell integrierter Befehl für den Zugriff auf den Befehlsverlauf.

    • -ln
      • l(Kleinbuchstabe L) - L ist der vorherige Befehl
      • n- nicht enthalten Befehl n Umbren
    • 1 (eins) - bezieht sich auf den neuesten Befehl

    fc -ln -1 Listet den neuesten Befehl ohne Befehlsnummer auf.

  • $(fc -ln -1) Führt den letzten Befehl aus.
  • $(fc -ln -1) | tail -n 1Führt den letzten Befehl aus und zeigt die letzte Zeile seiner Ausgabe an. Dies ist die sudo apt-get install textdrawZeile in Ihrem Beispiel.
  • $($(fc -ln -1) | tail -n 1)führt diesen Befehl aus.

Sie können dies alias:

alias execute_last_line_of_output_from_previous_command='$($(fc -ln -1) | tail -n 1)'

Ich überlasse es Ihnen, einen kürzeren Namen für den Alias ​​zu wählen.

Anmerkungen:

  • Dies funktioniert nur für einfache Befehle - keine Sonderzeichen wie |, <, >, ;, &, oder sogar Zitate. Wenn Sie mit komplexen Befehlen umgehen müssen, können Sie diese wahrscheinlich durch Hinzufügen eines Befehls ausführen. evalDies wird jedoch allgemein nicht empfohlen.
  • Wenn Sie auf etwas anderes als die letzte Zeile der Ausgabe zugreifen müssen (z. B. auf die vorletzte Zeile), können Sie etwas tun tail -n 17 | head -n 1.
  • Wenn Sie auf etwas anderes als den letzten Befehl zugreifen müssen, können Sie die Argumente in ändern fc. Beachten Sie, dass fc -ln -1die Abkürzung für ist fc -ln -1 -1. Verwenden Sie, um den drittletzten Befehl abzurufen fc -ln -3 -3.
  • Wenn Sie Flexibilität wie die oben genannten benötigen, sollten Sie wahrscheinlich eine Shell-Funktion schreiben, die Argumente anstelle eines Alias ​​akzeptiert.
G-Man sagt, "Monica wiedereinsetzen"
quelle