Kurze Antwort: das eingebaute fc
(Fix-Kommando) von Bash
fc
ist der Befehl, built-in in der bash, vorgenommen Bearbeiten und Befehle der Geschichte erneut auszuführen.
Es ist auch auf CygWin vorhanden und funktioniert auf allen Linux-Distributionen, auf denen ich getestet habe:
fc -s '\'='/' -1
Einige Erklärungen
Einige Worte mehr darüber, warum Sie "Substitution fehlgeschlagen" erhalten.
Es scheint, dass für den s
Modifikator (noch) nicht die Ersetzung des Backslash-Zeichens implementiert ist \
, das ist das Escape- Zeichen . Um sicherzugehen, dass wir zum Beispiel den Code der gnu-Version der Bash-Verlaufserweiterung sehen sollten (aber es gab den obigen Befehl, um zu erhalten, was Sie versucht haben ... also nehme ich es faul ...).
Einige Notizen:
Wir glauben, dass es bei jedem RegEx funktioniert, mit dem wir arbeiten sed
, aber es ist nicht garantiert. Der Backslash ist der Escape-Charakter der Erweiterung und das Problem ist hier. Darüber hinaus hängt das Verhalten der Erweiterung mit den shopt
Optionen zusammen, sodass wir von Fall zu Fall sehen sollten ...
Wenn Sie den String cd C:\Foo\Bar
in Ihre Bash-Shell einfügen , wird er erweitert und für den Interpreter als cd C:FooBar
angezeigt. In dieser Form wird es auch in der $_
internen Variablen gespeichert .
Wenn Sie stattdessen eingefügt cd "C:\Foo\Bar"
oder cd 'C:\Foo\Bar'
in die $_
Variable, sollten Sie finden C:\Foo\Bar
.
Da die Verlaufserweiterung unmittelbar nach dem Lesen einer vollständigen Zeile ausgeführt wird, bevor die Shell sie in Wörter zerlegt, könnten Sie versucht sein, sie mit einem mehr oder weniger einfachen Bashismus zu verwenden , z. B. mit einer Ableitung von (möglicherweise Hinzufügen :p
oder :q
, ""
, Parsen und so weiter ...)
!!:0 ${_//\\/\/}
Dies ist der Moment, um sich daran zu erinnern, dass es nicht sicher ist , mit Pfad und Dateinamen zu spielen , insbesondere wenn sie aus der Windows-Zwischenablage stammen (lesen Sie im Allgemeinen die Seite Warum nicht analysieren ls
?, Es hängt im Wesentlichen mit der Möglichkeit zusammen, Tabulatoren zu verwenden). Leerzeichen und Zeilenumbrüche als korrekte Zeichen für die Dateinamen und die Verzeichnisnamen ...).
Wenn Sie einen mit der Maus aufgenommenen Text einfügen , können Sie auch ein führendes Leerzeichen einfügen. Dadurch wird möglicherweise vermieden, dass Ihr Befehl im Verlauf beendet wird (dies hängt von den Shell-Optionen ab ...). Wenn ja, ist Ihre folgende !!
Anweisung ein nicht kontrollierter Befehl ... (siehe ein Beispiel in einer anderen Antwort ).Dies ist ein nicht benötigtes materielles Risiko .
Fazit
Geschichte Erweiterungen einführen Worte aus der Verlaufsliste in den Eingangsstrom, so dass es leicht zu wiederholen Befehle, legen Sie die Argumente zu einem vorherigen Befehl in die aktuelle Eingabezeile oder fix Fehler in früheren Befehlen schnell.
Wenn es nicht einfach ist, denke ich, dass wir etwas falsch machen ;-)
Ad nauseam: ein kleines Experiment
Ich habe dann histverify
in der Shell aktiviert ...
shopt -s histverify
echo C:\Foo\Bar
!!:s|C|D| {1,2}A
dann drücke ich Enterund als verifizierte Erweiterung finde ich
echo D:\Foo\Bar {1,2}A
dann drücke ich Enternochmal und es hallt
D:FooBar 1A 2A
Dies scheint darauf hinzudeuten , dass die substitution failed
in der Geschichte Expansion vor der verarbeiteten erzeugt Expansion Brace , so vor allem , und es scheint zu bestätigen , dass die s
Geschichte Modifikator nicht (noch) die Substitution des Prozesses \
Charakter als echte regex. ..
cd 'C:\foo\bar'