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'