Wie kann ich häufig verwendete Befehle schnell speichern und darauf zugreifen?

37

Ich habe viele Befehle, die ich routinemäßig ausführen muss, oft mit der geringsten Abweichung.

Im Moment bin ich sie alle in die Speicherung .bash_historyund Nutzung CTRL- Rden Zugriff auf sie, aber ich frage mich , ob es einen besseren Weg. Wonach ich suche:

  • Einfaches Hinzufügen eines neuen Befehls
  • Einfaches Suchen und erneutes Ausführen eines gewünschten Befehls
  • Vermeiden Sie unerwünschte Befehle in Vorschlägen

Leider ist bash_history bei der dritten Anforderung nicht so stark: Wenn ich ein paar tue cdund ls, füllt es die Verlaufsdatei schnell. Ich habe kürzlich erfahren, HIST_SIZEdass Sie den Verlauf konfigurieren können, um Duplikate oder bestimmte Befehle zu vermeiden, aber bevor Sie all dies konfigurieren, wollte ich sicherstellen, dass dies der beste Weg ist.

Konerak
quelle
7
für alltägliche Befehle aliasvielleicht nützlicher. z.B. alias gfc="git fetch origin"
Nummer 5

Antworten:

20

Ich finde die folgenden readline Befehle sehr nützlich

history-search-backward,
history-search-forward

(Seien Sie sich bewusst, dass sie sich von den üblichen reverse-search-historyunterscheiden forward-search-history, gebunden an Ctrl- R, Ctrl- S).

Ich habe diese Befehle im Zusammenhang mit Ctrl- Upund Ctrl- dem DownEinfügen der folgenden Zeilen in ~/.inputrc:

"\e[1;5A": history-search-backward
"\e[1;5B": history-search-forward

So funktionieren sie: Schreiben Sie einige Zeichen des Befehlsanfangs, drücken Sie Ctrl-, Upund der nächstältere Befehl, der mit diesem Präfix beginnt, wird angezeigt. Drücken Sie erneut, um den nächsten Befehl anzuzeigen, und so weiter. Wenn Sie zufrieden sind, drücken Sie, nachdem Sie möglicherweise den Befehl geändert haben, Enterum ihn auszuführen.

Enzotib
quelle
1
+1 dafür mache ich das gleiche, obwohl ich sie nur an die Aufwärts- und Abwärtspfeiltasten gebunden habe (kein CTRL-Modifikator), was für mich funktioniert. Wenn Sie ebenfalls die Zeilen tun möchten, die Sie benötigen, sind "\e[B": history-search-forwardund"\e[A": history-search-backward
Simon Whitaker
Berücksichtigen Sie auch grow HISTFILESIZEund / oder HISTSIZE(zsh unterstützt nur HISTSIZE, bash unterstützt beide), um sicherzustellen, dass Ihr Puffer ausreichend groß ist. Die SO Frage bash HISTSIZE vs. HISTFILESIZE? kann weiter beleuchten.
Adam Katz
56

Ein weiterer Tipp: Manchmal benutze ich Kommentare, um einen Befehl mit einem Lesezeichen zu versehen:

my_command #bookmark

dann:

[ctrl-r]#bookmark
Chris J
quelle
liebe es! - schön.
Greg
17
Bashtags! Genius. :-)
Simon Whitaker
Sehr schön! Ich werde dies auch für meine Mysql-Cli verwenden :)
Konerak
Das ist ausgezeichnet! Leider behandelt zshell # nicht als Beginn eines Kommentars in einer interaktiven Sitzung. Kennen Sie einen ähnlichen Trick dafür?
Nathan Long
1
@NathanLong: $_bookmark. Es könnte argumentiert werden, dass dies ein schrecklicher Hack ist, der die Tatsache ausnutzt, dass nicht vorhandene Variablen zu nichts expandieren, aber es funktioniert mit dem Vorbehalt, dass Leerzeichen nicht erlaubt sind (verwenden Sie stattdessen _s).
Kampu
7

Obwohl der Umfang sehr begrenzt ist, möchte ich auf diese beiden Erweiterungsplatzhalter hinweisen:

!! 

ist eine Platzhaltererweiterung für den letzten Befehl. Nützlich, wenn Sie vergessen haben, sudovor dem Befehl zu setzen .

!$ 

wiederholt den letzten Parameter. Nützlich, wenn Sie mit einen anderen Befehl wiederholen möchtena/very/long/path/name/you/do/not/want/to/type/again

chiborg
quelle
Ja, toller Tipp ... wenn ich mich nur daran erinnern würde, sie zu benutzen :)
Jeach
6

Benutze 'alias'

alias ist ein großartiges Werkzeug dafür.

  • Sie können einfach einen in der Befehlszeile deklarieren, der während der aktuellen Shell-Sitzung verwendet werden soll.
  • Wenn Sie es in Zukunft verwenden, können Sie es zu Ihrer Shell-Konfiguration hinzufügen.

Wenn Sie einen Alias ​​verwenden, ist er genau so, als ob Sie ihn eingegeben hätten, und daher recht flexibel. Zum Beispiel können Sie es mit Rohren verwenden:

alias findfoo="grep 'foo'"
echo 'foo1 \n foo2 \n bar1 \n bar2 \n foo3' | findfoo # Does your custom grep

Sie sollten in der Lage sein, "leichte Variationen" vorzunehmen, indem Sie alle Flags übergeben, die Sie nicht bereits angegeben haben.

echo 'foo1 \n foo2 \n bar1 \n bar2 \n foo3' | findfoo -v # finds non-matches
Nathan Long
quelle
5

Ich erstelle minimale Shell-Skripte für meine häufigen Befehle und gebe ihnen kurze Namen. Sie werden alle am selben Ort gespeichert, der hinzugefügt wird PATH.

Auf diese Weise kann ich über eine Verknüpfung auf sehr komplexe Befehle zugreifen und anders als bei einer Verknüpfung aliasdie veränderlichen Teile meiner Aufgabe in Befehlszeilenargumente umwandeln.

David Grellscheid
quelle
3
Wenn Sie nur Argumente übergeben möchten, sollten Sie stattdessen Funktionen definieren. Wenn Sie vollständige Skripte benötigen, ist dies eine gute Lösung :)
Konerak
@Konerak Das muss ich probieren. Normalerweise erstelle ich nur ein Skript, aber das Definieren von Funktionen wäre viel sauberer.
ixtmixilix
4

Ich verwalte eine Kopie von .bash_history in Git . Um dies zu vereinfachen, habe ich gesetzt

# don't put duplicate lines in the history
# don't save commands which start with a space
HISTCONTROL=ignoredups:erasedups:ignorespace

# append to the history file, don't overwrite it
shopt -s histappend

in .bashrc und die folgenden (für den allgemeinen Gebrauch geänderten) Befehle in einem Bereinigungsskript

# Ensure a single space at the end of each line to easier add more parameters
sed -i -e 's/ *$/ /' "~/.bash_history"

sort --unique --output="~/.bash_history" "~/.bash_history"

was ich laufe, bevor ich Zeilen hinzufüge git gui. Da die Verlaufsdatei mit jedem Befehl geändert wird, habe ich auch einen speziellen Befehl zum Aktualisieren dieses bestimmten Repositorys:

git stash && git pull && git stash pop
l0b0
quelle
+1 in erster Linie zum Erwähnen HISTCONTROL=ignorespace, was manchmal wichtig ist, um die Geschichte nicht zu überfrachten.
Quodlibetor
2

Unter all den anderen Antworten, die hier die Geschichte betreffen.

ich setze

HISTFILESIZE=2024
HISTSIZE=1024

in ~ / .bash_profile

Zusätzlich zu den anderen Kommentaren zu: history

Ein weiteres nützliches Feature ...

Beginn eines Rückrufs mit

!first few letters<ESC>Ctrl-E

ruft den letzten Befehl auf, der mit den ersten Buchstaben begonnen hat

z.B:

!find<ESC>Ctrl-E

Sie haben nicht erwähnt, ob Sie eine GUI oder nur eine Befehlszeile verwenden. Wenn Sie eine grafische Benutzeroberfläche verwenden, können Sie mit einem der permanenten Zwischenablage-Manager häufig verwendete Befehle, Benutzer-IDs, Kennwörter, URLs usw. kopieren und einfügen.

bsd
quelle
Wow, !find<ESC>CTRL-Efunktioniert, aber ich bezweifle, dass ich mich morgen daran erinnern kann. Was ist das ESC CTRL-E?
Konerak
nur eine verbindung zu einem erweiterten schlüssel
bsd
0

Das Erlernen der Verwendung Ctrl-Rund Ctrl-Sdie einfache Suche nach den Befehlen, nach denen Sie im Verlauf suchen, sowie das Auffinden der Umgebungsvariablen HISTCONTROL, mit der Duplikate ignoriert und die Site der Bash-Verlaufsdatei geändert werden können.

Normalerweise mache ich viele, Ctrl-Rgefolgt von Ctrl-Eund ändere einige Parameter, wenn ich einen gefundenen Befehl überspringe, indem ich Ctrl-Rzu oft einen drücke, um ihn Ctrl-Szu retten.

Evgeny
quelle
2
Oft ist das tty so eingestellt, dass Ctrl-S die "Stop" -Sequenz ist und nicht (direkt) für die Vorwärtssuche zur Verfügung steht.
Enzotib
In solchen Fällen kann die Vorwärtssuche einer anderen Funktion als <kbd> Strg-S </ kbd> zugeordnet werden.
Evgeny
0

Ich bevorzuge es immer, zuletzt verwendete Befehle und deren Ausgabe zu speichern.

script filename
Balaswamy vaddeman
quelle
0

Zusätzlich zu den guten Antworten oben kann AutoKey erstaunlich hilfreich sein, wenn Sie zufällig eine GUI verwenden, die auf KDE oder Gnome basiert.

https://code.google.com/p/autokey/

Sie können Phrasen erstellen, die durch Eingeben einiger Zeichen oder Drücken eines Hotkeys ausgelöst werden. Diese Phrasen werden dann ersetzt oder zu Ihrer Eingabe hinzugefügt.

Es unterstützt auch in Python geschriebene Skripte, mit denen Sie fast alles machen können, wenn Sie Python kennen. Ich kenne Python noch nicht, aber ich bekomme bereits einige sehr einfache Skripte, um nette Dinge zu tun.

Alles scheint von Ihrer Tastatur zu kommen, daher funktioniert es mit jeder Anwendung, die Tastatureingaben akzeptiert - und mit Ihrem Desktop selbst.

Es gibt viele Optionen, die steuern, wie und wo diese Dinge aktiviert werden, sodass einige nur in Ihrer Konsole und andere nur in einem anderen Fenster funktionieren. Sie können auch festlegen, dass Phrasen ausgeführt werden, sobald Sie die Zeichenfolge eingeben, die sie auslöst, oder warten, bis Sie ihnen das OK geben.

Joe
quelle
0

Wie andere gesagt haben, ist Alias ​​dein Freund. Für etwas kompliziertere Dinge (wenn Sie Argumente irgendwo zwischen Anweisungen benötigen) verwende ich Funktionen in meiner .zshrc, wie:

function ff() { find . -iname "*$**" }

das funktioniert wie locate (ich benutze es, wenn db aus irgendeinem Grund nicht verfügbar ist). Oder

function chuck() { ps aux | grep $1 | tr -s '\t' ' ' | cut -f2 -d' ' | xargs kill $2 }

für einen Ersatz von Killall.

rkj
quelle
0

Zusätzlich zur Verwendung Cntl-Rzum Zurückblicken in habe .bash_historyich auch eine README-Datei in dem ~/developVerzeichnis, in das ich lange Befehle wie git/ geschrieben habe svn, damit ich später darauf zurückgreifen kann, wenn ich es brauche. Ebenso plane ich, eine ~/install/READMEDatei zu haben, in der alle allgemeinen Paketnamen abgelegt werden, die ich normalerweise nach der Installation einer neuen Version von Linux / Ubuntu installiere. Die Idee ist also, eine README-Datei in jedem Verzeichnis zu haben, z. B. Video, Audio, ... und die allgemeinen Befehle / Tipps, die Sie in einem späteren Zeitpunkt möglicherweise benötigen.

Amr
quelle