fcэто команда, встроенная в оболочку bash, предназначенная для редактирования и повторного выполнения команд истории.
Он также присутствует в CygWin и работает на всех дистрибутивах Linux, на которых я тестировал:
fc -s '\'='/' -1
Некоторые объяснения
fcэто встроенная команда bash для вывода, редактирования и повторного выполнения команд из списка истории.
-1примет последнюю команду в истории. Обратите внимание, что даже !!определяется (читать из man bash) как
!! Refer to the previous command. This is a synonym for! -1 '.
-sзаменить шаблон другим. На этот раз из help fc(встроенная команда так help):
В формате `fc -s [pat = rep ...] [command] 'COMMAND повторно выполняется после выполнения замены OLD = NEW.
Хорошо, они имеют в виду pat=repвместо OLD=NEW...
- Шаблоны будут читаться оболочкой, поэтому мы должны защищать их с помощью quote:
'\'и '/'.
Несколько слов о том, почему вы получаете «замена не удалась»
Похоже, что для s модификатора (пока) не реализована подстановка символа обратной косой черты \, то есть escape- символа . Чтобы быть уверенным, мы должны увидеть код, например, версии gnu расширения истории bash (но была указанная выше команда, чтобы получить то, что вы пытались сделать ... поэтому я считаю это ленивым ....).
Некоторые заметки:
Мы склонны думать, что он будет работать каждый RegEx, с которым мы работаем sed, но это не гарантировано. Обратная косая черта является escape-символом расширения, и проблема здесь. Кроме того, поведение расширения связано с shoptопциями, поэтому мы должны начать видеть в каждом конкретном случае ...
Когда вы вставите строку cd C:\Foo\Barв оболочку bash, она будет развернута и появится для интерпретатора как cd C:FooBar; в этом виде он также будет храниться во $_внутренней переменной.
Если вы вместо этого вставили cd "C:\Foo\Bar"или cd 'C:\Foo\Bar'в $_
переменной вы должны найти C:\Foo\Bar.
Поскольку расширение «История» выполняется сразу после прочтения полной строки, перед тем, как оболочка разбивает ее на слова, у вас может возникнуть соблазн начать использовать его с некоторым более или менее простым башизмом , например, с некоторой производной от (может быть, добавления :pили :q, "", разбор и тд ...)
!!:0 ${_//\\/\/}
Это момент, который нужно помнить, что небезопасно начинать играть с путями и именами файлов , особенно если они приходят из буфера обмена Windows (читайте в общем на странице « Почему не анализировать ls?» , Это по сути связано с возможностью использовать tab, пробелы и переводы строк как правильные символы для имен файлов и каталогов ...).
Более того, когда вы вставляете текст, захваченный мышью , вы также можете вставить начальный пробел. Это может помочь избежать завершения вашей команды в истории (это зависит от параметров оболочки ...). Если это так, ваша следующая !!команда будет неконтролируемой ... (см. Пример в другом ответе ).Это ненужный ощутимый риск .
Вывод
Расширения истории вводят слова из списка истории во входной поток, что упрощает повторение команд, вставку аргументов предыдущей команды в текущую строку ввода или быстрое исправление ошибок в предыдущих командах.
Если это не так просто, я начинаю думать, что мы делаем что-то не так ;-)
До тошноты: небольшой эксперимент
Я включил histverifyв оболочке тогда ...
shopt -s histverify
echo C:\Foo\Bar
!!:s|C|D| {1,2}A
потом жму Enterи в качестве проверенного расширения нахожу
echo D:\Foo\Bar {1,2}A
затем я нажимаю Enterснова, и это эхом
D:FooBar 1A 2A
Похоже, это указывает на то, что substitution failedгенерируется в расширении истории, обработанном до расширения Брэйс , поэтому, во- первых , и это подтверждает, что sмодификатор истории (еще) не обрабатывал замену \символа как реального регулярного выражения. ..
cd 'C:\foo\bar'