Gibt es eine Möglichkeit, Befehle aus dem Verlauf auszuführen?

99

Zum Beispiel:

[root@ip-10-0-7-125 ~]# history | grep free
  594  free -m
  634  free -m | xargs | awk '{print "free/total memory" $17 " / " $ 8}'
  635  free -m
  636  free -m | xargs | awk '{print "free/total memory" $9 " / " $ 10}'
  736  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $9}'
  740  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $8}'
  741  free -m | xargs | awk '{print "free/total memory: " $17 " / " $8 " MB"}'

Ich frage mich nur, ob es eine Möglichkeit gibt, den Befehl 636 auszuführen, ohne ihn erneut einzugeben. Geben Sie einfach etwas plus die Zahl ein, wie etwa history 636 oder so.

Der Eine
quelle
14
wissen Sie über ctrl-r?
Carlos Campderrós
1
Ja, das weiß ich, aber es ist nicht genau das, was ich will.
The One

Antworten:

170

In der Bash wird nur !636ok sein.

user164825
quelle
12
In Linux- Dies hat mehr mit der Shell zu tun (bash, zsh usw.), auf der eine Person ausgeführt wird, als mit dem Betriebssystem, auf dem Sie sie ausführen. Es gibt Shells unter Linux ohne Unterstützung für die Geschichte.
Zoredache
@Zoredache Und in ähnlicher Weise funktioniert dies in den meisten Implementierungen von Bash unter Windows.
Ajedi32
1
Natürlich nicht nur Bash, sondern auch andere Shells - einschließlich csh.
Drew
5
Wenn Sie einen Befehl haben, der dem, was Sie ausführen möchten, sehr ähnlich ist, können Sie ihn beispielsweise anhängen, um ihn :pzu drucken, ohne ihn auszuführen !636:p. Das bedeutet, dass Sie es einfach wieder aus Ihrem Verlauf auswählen können, indem Sie auf den Aufwärtspfeil
klicken
78

Ja, es heißt "Geschichtserweiterung". Sehen

LESS='+/^HISTORY EXPANSION' man bash

für alle Details.

Die Verwendung eines Ausrufezeichens gefolgt von einer Zahl ist wohl die einfachste Verwendung:

!636

Sie können den zuletzt ausgeführten Befehl jedoch auch direkt ausführen, ohne dessen Verlaufsnummer zu kennen:

!!

Oder Sie können zwei Befehle zurück ausführen:

!-2

Die Form, die ich jedoch am häufigsten benutze, besteht darin, das letzte Argument des letzten Befehls zu wiederholen:

echo this text goes into a file > /tmp/afile.txt
cat !$

Oder nehmen wir an, ich inspiziere eine Datei. Mit der Tab-Vervollständigung kann ich Folgendes tun:

ls -l /really/long/path/to/some/file
less !$

Wieder lesen Sie die man - Seite für weitere Informationen:

LESS='+/^HISTORY EXPANSION' man bash
Platzhalter
quelle
25
Interaktiv Alt-.kann bequemer sein als !$. Es fügt das letzte Argument des letzten Befehls wörtlich in die Zeile ein.
Ulidtko
2
@ulidtko Wo sind diese besonderen Fluchten dokumentiert (von denen ich wusste !$, aber noch nie davon gehört habe Alt-.)? Veröffentlichen Sie bitte einen Link dazu?
Edmz
5
LESS="+/DEFAULT KEY BINDINGS" man 3 readline, /etc/inputrc, ~/.inputrc. Viele Programme außer bash verwenden libreadline. für diejenigen , die tun, erhalten Sie die gleichen Funktionen wie Alt-., Ctrl-X-U(rückgängig machen), Ctrl-/(beschreiben Abkürzung), Tab-Vervollständigung, etc. - kostenlos. Beispielsweise können mit nur drei Zeilen von PYTHONSTARTUPeiner die Tab-Vervollständigung und der Verlauf in der Standard-Python-REPL aktiviert werden . Was (meistens) genauso funktioniert wie in Bash, da es die GNU Readline-Bibliothek ist, die die Arbeit macht. In der Manpage der Readline werden die Funktionen ausführlich beschrieben.
Ulidtko
2
Ctl-UpArrow (oder AltUpArrow bei Bash) scrollt rückwärts durch die Verlaufsliste. Wenn Sie ein paar Zeichen eingeben, erhält der Pfeil nach oben nur die Befehle, die mit diesem Buchstaben beginnen, z. Dies funktioniert auch in Dingen wie gnuplot und gdb, die readline verwenden.
Jamesqf
2
@ Ajedi32, siehe die letzte fettgedruckte Zeile in meiner Antwort. :) Ehrlich gesagt ist diese Antwort kaum ein Vorgeschmack darauf, was die Erweiterung der Geschichte bewirken kann . Beachten Sie, dass dies auf der Ebene der Shell und nicht auf der Ebene des aufgerufenen Befehls liegt. Daher wird echo {1..5}gefolgt von fünf Dateien touch !$berühren , nicht nur eine. Genau genommen ist es also nicht das letzte Argument, sondern das letzte Shell-Wort in dieser Zeile. (Versuchen Sie auch, gefolgt von .) Wenn Sie eine Möglichkeit finden, dies deutlicher auszudrücken, können Sie eine Änderung vorschlagen. echo hello >tempecho goodbye !$
Wildcard
14

Ein netter, wenn Sie nicht die erste Geschichte wollen, notieren Sie sich die Nummer, etc:

in bash (und vielleicht auch anderen):

ctrl-r something 

( ctrl-r= "Rückwärtssuche interaktiv") ( something= ein Teil eines vorherigen Befehls)

Dies zeigt Ihnen die neueste Verlaufszeile mit something. Um die vorherige zu erhalten, drücken Sie erneut die Tastenkombination Strg-R (allein), wenn eine vorherige Zeile abgerufen wird.

Ex:

ctrl-r  10

um die neueste Verlaufszeile mit '10' anzuzeigen (zum Beispiel die Zeile mit $10, in Ihrem Beispiel) und ctrl-rerneut, bis Sie die gesuchte Verlaufszeile abrufen

Wenn die Linie , die Sie erscheinen wollten, nur , Enterum es auszuführen (oder Sie können es auch bearbeiten, die mit arrow keys, backspaceund ctrl-aan den Anfang der Zeile zu gehen, ctrl-ezum Ende zu kommen, ctrl-k: zu „töten“ vom Cursor bis zum Ende der Zeile (= löscht + speichert es in einem Puffer) ctrl-y,: um ein zuvor getötetes Bit aus dem Puffer wiederherzustellen, etc.)

Wenn Sie vorwärts suchen möchten (Strg-S), müssen Sie zuerst XON deaktivieren : siehe https://stackoverflow.com/a/791800/1841533 :

msgstr "nur um XON / XOFF durch Ausführen zu deaktivieren

stty -ixon

"(und dann kannst du ctrl-s benutzen, ohne dass es das Terminal einfriert)

Olivier Dulac
quelle
Wenn ich dies tue und versehentlich einmal zu oft Strg-R drücke, gibt es eine Möglichkeit, im Verlauf erneut vorwärts zu suchen?
Kasperd
@kasperd: Ja das kannst du. Viele Antworten an sich weisen darauf hin: Strg-s für die Vorwärtssuche.
Olivier Dulac
Leider wird Strg-S verwendet, um das Terminal einzufrieren, und Bash deaktiviert dies nicht, sodass dies in der Standardkonfiguration nicht funktioniert. (Andere Programme - wie Emacs - deaktivieren die Tastenkombination, um das Terminal einzufrieren, sodass Strg-s für die Suche verwendet werden kann.)
Kasperd
@kasperd: Ja, tut mir leid, dass ich das nicht erwähnt habe (ich habe auf "viele Antworten" hingewiesen, weil sie genau das tun, aber ich habe mir nicht die Zeit genommen, dies in den Kommentar einzutippen oder einen Link zu geben ... (ich habe meine verwendet) Ich bin jetzt nach Hause zurückgekehrt und konnte das in der obigen Antwort ändern. ctrl-s für die Suche nach Bash-Verlauf muss zuerst stty -ixon sein
Olivier Dulac
Dieser Befehl wird die normale Verwendung von Strg-s unterbrechen, daher ist dies keine Option.
Kasperd
7

Sie können die in fc eingebaute Shell verwenden :

fc -s 636
Steven Penny
quelle
2
Dies ist tatsächlich besser als die akzeptierte Antwort, aber Sie müssen die entfernen -s, um die Vorteile zu erhalten. Wenn Sie den Befehl ausführen fc 636, öffnen Sie einen Editor mit dem Befehl 636 aus Ihrem Verlauf im Puffer, und wenn Sie den Befehl speichern und beenden (geändert oder nicht), wird er ausgeführt. Und noch besser, dieser ist POSIX-konform .
Wildcard
@StevenPenny Danke. Und ja, ich weiß, was POSIX ist, obwohl ich die Relevanz nicht sehe. Unabhängig davon, einige leicht zugängliche und mitgelieferte Dokumentation wäre schön.
Faheem Mitha
@FaheemMitha versuchen, "help fc" auszuführen.
Wildcard
@Wildcard helpist nicht POSIX - müssen möglicherweise tun man dashoder ähnlich
Steven Penny
@Wildcard Danke. Ich neige dazu zu vergessen, helpexistiert. Eine weitere Shell eingebaut. Und ein Rätsel für unachtsame Benutzer, die vielleicht Hilfe bei einem neuen System benötigen, aber stattdessen mit einer Menge Kauderwelsch konfrontiert werden. :-(
Faheem Mitha
3

Es gibt HSTR- hhBefehl für bashund zshinteraktive Befehlsauswahl, besser als Strg-R Rückwärtssuche:

Beispiel für einen interaktiven Verlaufsbefehl

Es ist interaktiv, sodass Sie den Befehl suchen und bearbeiten können, bevor Sie ihn ausführen.

Unter Ubuntu können Sie hhmit dem folgenden Einzeiler installieren :

sudo add-apt-repository ppa:ultradvorka/ppa && sudo apt-get update && sudo apt-get install hh && hh --show-configuration >> ~/.bashrc

oder Schritt für Schritt:

sudo add-apt-repository ppa:ultradvorka/ppa
sudo apt-get update
sudo apt-get install hh

Installieren Sie hhauf Fedora, RHEL oder CentOS:

sudo dnf|yum install hstr -y

Unter macOS mit homebrew:

brew install hh

... dann konfigurieren Sie es mit:

hh --show-configuration >> ~/.bashrc

Dadurch wird das Standardverhalten von Strg-R ersetzt.

Führen Sie hh --show-configurationden Befehl aus , um zu bestimmen, was an Ihr Bash-Profil angehängt wird.

Weitere Konfigurationsoptionen finden Sie auf der Projekthomepage unter Github: https://github.com/dvorka/hstr

Modlin
quelle