2014-01-29 1 views
5

Ich habe einen Befehl mit Parametern in der Shell. wieWie Parameter im Shell-Befehl vertauscht werden

Command -a -b 

nehmen ab sind sehr lange Verzeichnisnamen, und sie sind nicht immer die ersten und letzten Parameter.

Allerdings muss ich diesen Befehl erneut verwenden. Ich benutze , um den Befehl zurückzugehen, aber diesmal muss ich ab umkehren.

Command -b -a 

Anstatt sie erneut zu tippen, gibt es eine Möglichkeit, sie schnell zu tauschen?

Vielen Dank im Voraus.

Antwort

10

Ja können Sie history substitution verwenden:

$ echo foo bar 
foo bar 
$ !:0 !:2 !:1   # previous command with second arg then first arg 
echo bar foo 
bar foo 
$ 
+1

Wenn Sie die ersten und letzten Argumente auszutauschen passieren zu wollen, können Sie schreiben: '+! $ 0 ^' –

+1

Oder sogar ': 0: 2: 1 '. Sie müssen die Ausrufezeichen nicht verdoppeln. – rojomoke

+0

@rojomoke: cool - ich wusste das nicht - ich werde die Antwort aktualisieren. –

4

Sie Alt + t verwenden können das aktuelle und das vorherige Wort zu tauschen.

Here sind einige weitere Verknüpfungen.

Beachten Sie, dass Sie Wörter austauschen, nicht Parameter. Wenn Sie zum Beispiel die Reihenfolge grep verwechselt haben, nehmen Sie ihre Parameter wie in grep ~/Documents/myFile searchString und wollen das zu grep searchString ~/Documents/myFilekorrigieren Alt + t wird Ihnen nicht helfen.

Gehen Sie stattdessen für Paul's answer und tun Sie !:0 !:2 !:1.

Wenn das zu unbequem für Sie zu geben (es ist für mich) Sie einen Aliasnamen für das in ~/.bash_alias erstellen:

# Swap the first and the second argument of the last command 
alias swapArgs='$(history -p !:0 !:2 !:1)' 
1

Anstatt die args tauschen, können Sie einfach Ausschneiden und Einfügen die letzte arg in einen anderen Ort. Ctrl-W schneidet das letzte Argument und Ctrl-Y wird es einfügen.

$ # Cursor position is shown as | 
$ ls foo bar| 

$ # Press <Ctrl-W> to cut the argument just before the cursor 
$ ls foo | 

$ # Now press <Alt-B> to move the cursor one argument back 
$ ls |foo 

$ # Now press <Ctrl-Y> to paste the cut argument 
$ ls bar|foo 

$ # Now press <space> to insert a space between the arguments 
$ ls bar |foo 

$ # You can safely press <enter> while the cursor is in the middle of the line 
$ ls bar |foo 
bar foo