Wie schreibe ich einen Bash-Alias, der !$ durch das letzte Wort des vorherigen Befehls ersetzt?

Wie schreibe ich einen Bash-Alias, der !$ durch das letzte Wort des vorherigen Befehls ersetzt?

Ich habe ein Skript namens cpodin, das mehrere Build-Artefakte in ein anderes Verzeichnis kopiert. Anschließend bearbeite ich sie SHA1SUMim Zielverzeichnis.

Zum Beispiel:

cpodin /foo/bar/baz
vim !$/SHA1SUM

Wie mache ich aus dem letzten Befehl einen Alias fixsha, der kein Argument akzeptiert und SHA1SUMin dem Verzeichnis Änderungen vornimmt, das durch das letzte Argument des vorherigen Befehls benannt wurde? Ein Alias ​​von

alias fixsha='vim !$/SHA1SUM'

führt zu Bearbeitungsversuchen !$/SHA1SUManstelle von /foo/bar/baz/SHA1SUM.

Antwort1

Bash führt nach der Aliaserweiterung keine Verlaufserweiterung durch, daher müssen Sie dies explizit mit tun history, dokumentiert inIntegrierte Funktionen im Bash-Verlaufund unten ausgezogen wiedergegeben.

history -ps args

  • -p
    Führen Sie eine Historiensubstitution durch fürArgumenteund zeigen Sie das Ergebnis auf der Standardausgabe an, ohne die Ergebnisse in der Verlaufsliste zu speichern.
  • -s
    Die Argumente werden als einzelner Eintrag am Ende der Verlaufsliste hinzugefügt.

Ein Alias ​​von alias fixsha='vim $(history -p !$)/SHA1SUM'funktioniert meistens, aber nicht wie beabsichtigt, wenn !$es zu einem Pfad erweitert wird, der Leerzeichen enthält. Das Hinzufügen von doppelten Anführungszeichen um das Pfadargument schützt alle Escapezeichen bei Leerzeichen und führt zu vim "/foo/bar\ baz/SHA1SUM"anstatt dem gewünschten vim /foo/bar\ baz/SHA1SUModer dessen Äquivalent vim "/foo/bar baz/SHA1SUM".

Daher ist es zusätzlich zur expliziten Erweiterung des Verlaufs evalauch erforderlich, eine Anführungszeichenebene aufzuheben.

alias fixsha='eval vim "$(history -p !$)/SHA1SUM"'

Notiz:Es mag Sie überraschen, dass die Anführungszeichen in der obigen Aliasdefinition unnötig sind. Das liegt daran, dass zwischen dem erweiterten Wert von !$und kein Leerzeichen steht /SHA1SUM, um die Worttrennung von Bash auszulösen. Mir gefällt es jedoch, dass sie da sind, um die Absicht zu betonen, dass es zu einem einzelnen Argument erweitert wird.

verwandte Informationen