2010-09-17 10 views
5

Manchmal muss ich einen Befehl mehrmals hintereinander ausführen, zum Beispiel um zu sehen, ob ein Dienst gestartet wurde, und es wird mühsam, meine Hände von meiner normalen Tippposition wegzubewegen, um die Aufwärts- und Eingabetasten wiederholt zu drücken. Gibt es eine Möglichkeit, den vorherigen Befehl ohne die Nach-oben- und die Eingabetaste auszuführen, vielleicht mit einem ausgeklügelten Shell-Skript?Alternative zu Aufwärtspfeil + Enter, um den vorherigen Befehl auszuführen?

Ich habe Folgendes versucht, aber es ist nicht zufriedenstellend, weil es keine Aliase ausführen kann, und es ist ein wenig langsam.

history | tail -2 | head -1 | cut -d' ' -f4- | cat > prev_command.txt 
sleep .01 
chmod 777 prev_command.txt 
eval prev_command.txt 
rm prev_command.txt 

Im Idealfall würde ich einen Alias ​​zu diesem Skript haben, damit ich so etwas wie „zurück“ in der Befehlszeile eingeben können und drücken Sie die Eingabetaste erneut den vorherigen Befehl auszuführen.

+0

Also tippen "prev" ist schneller als up + eingeben? – halfdan

+3

sollte auf superuser.com verschoben werden – stepancheg

Antwort

3

In bash:

 
$ help fc 
fc: fc [-e ename] [-lnr] [first] [last] or fc -s [pat=rep] [command] 
    Display or execute commands from the history list. 

    fc is used to list or edit and re-execute commands from the history list. 
    FIRST and LAST can be numbers specifying the range, or FIRST can be a 
    string, which means the most recent command beginning with that 
    string. 

    Options: 
     -e ENAME select which editor to use. Default is FCEDIT, then EDITOR, 
      then vi 
     -l list lines instead of editing 
     -n omit line numbers when listing 
     -r reverse the order of the lines (newest listed first) 

    With the `fc -s [pat=rep ...] [command]' format, COMMAND is 
    re-executed after the substitution OLD=NEW is performed. 

    A useful alias to use with this is r='fc -s', so that typing `r cc' 
    runs the last command beginning with `cc' and typing `r' re-executes 
    the last command. 

    Exit Status: 
    Returns success or status of executed command; non-zero if an error occurs. 

Hinweis der Vorschlag für Alias ​​r; Ich benutze das häufig.

15

In bash können Sie ctrlp drücken zum vorherigen Befehl zu gehen - das ist viel besser als auf die Pfeiltasten bewegen zu müssen.

+0

Dies funktioniert auch in 'tcsh'. –

+0

In ksh und zsh mit "r" funktioniert auch. –

+4

Und '' ctrl + n'', um zum nächsten Befehl zurückzukehren, wenn Sie zu weit gehen. – davidjb

1

Je nachdem, welches Terminal Sie verwenden, kenne ich früher oft F3 als Option zum Wiederholen, aber das ist immer noch außerhalb des normalen Bereichs für das Tippen, außer Sie haben eine spezielle Tastatur mit besser zugänglichen Funktionstasten.

Meine Tastatur macht die Funktionstasten leicht zugänglich, aber ich mache nicht viel Befehlszeile in Unix mehr, so dass ich nicht in der Lage wäre, Ihnen sicher zu sagen, ob das noch möglich ist.

7

Verwenden

!!

Ihre vorherigen Befehl auszuführen.

sudo !! 

funktioniert auch, für die Aufzeichnung.

+0

Gibt es eine Möglichkeit zu setzen !! oder die Strg-P ​​in der Antwort unten in einen Alias? Ich habe versucht, Alias ​​l = '!!', aber es gibt mir einen Fehler "bash: !!: Befehl nicht gefunden", wenn ich es ausführe. – Thomas

4

Anstatt den gleichen Befehl mehrmals nacheinander auszuführen, warum nicht watch stattdessen? watch wird einen angegebenen Befehl wiederholt ausführen und die Ausgabe in stdout anzeigen, so dass Sie sehen, wie sich diese im Laufe der Zeit ändert.

watchcommand

2

Sind Sie ein Emacs oder vi Benutzer? Sie können verwenden

set -o vi 
set -o emacs 

, um Emacs oder Vi Keybindings festzulegen. Sie können dann die emacs- oder vi-Tastenbelegungen in bash verwenden. Ich weiß nicht, ob das für andere Shells funktionieren sollte. Ich glaube, dass der vi-Modus im Einfügemodus startet, also müssen Sie esc drücken, um in den Befehlsmodus zu gelangen. Im Emacs-Modus (Standardeinstellung) können Sie Strg + P und dann Strg + J verwenden, um zur vorherigen Zeile zu wechseln und einen Wagenrücklauf durchzuführen.

Ansonsten können Sie verwenden !! wie jemand anderes vorgeschlagen hat.

Verwandte Themen