
Ich habe ein Skript namens cpodin
, das mehrere Build-Artefakte in ein anderes Verzeichnis kopiert. Anschließend bearbeite ich sie SHA1SUM
im Zielverzeichnis.
Zum Beispiel:
cpodin /foo/bar/baz
vim !$/SHA1SUM
Wie mache ich aus dem letzten Befehl einen Alias fixsha
, der kein Argument akzeptiert und SHA1SUM
in 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 !$/SHA1SUM
anstelle 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/SHA1SUM
oder dessen Äquivalent vim "/foo/bar baz/SHA1SUM"
.
Daher ist es zusätzlich zur expliziten Erweiterung des Verlaufs eval
auch 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.