1

У меня есть скрипт с именем cpodin который копирует несколько артефактов сборки в другой каталог. После этого я редактирую SHA1SUM в каталоге назначения.

Например:

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

Как сделать последнюю команду псевдонимом fixsha который не принимает аргументов и редактирует SHA1SUM в каталоге, названном последним аргументом предыдущей команды? Псевдоним

alias fixsha='vim !$/SHA1SUM'

приводит к попыткам редактирования !$/SHA1SUM вместо /foo/bar/baz/SHA1SUM .

1 ответ1

2

Bash не выполняет раскрытие истории после раскрытия псевдонима, поэтому вы должны делать это явно, используя history , описанную в Bash History Builtins и приведенную ниже.

history -ps args

  • -p
    Выполните подстановку истории по аргументам и отобразите результат на стандартном выводе, не сохраняя результаты в списке истории.
  • -s
    Аргументы добавляются в конец списка истории как одна запись.

Псевдоним alias fixsha='vim $(history -p !$)/SHA1SUM' будет работать большую часть времени, но не так, как предполагалось, когда !$ раскрывается в путь, содержащий пробелы. Добавление двойных кавычек вокруг аргумента пути защитит любые экранированные символы в vim "/foo/bar\ baz/SHA1SUM" а не к желаемому vim /foo/bar\ baz/SHA1SUM или его эквивалентному vim "/foo/bar baz/SHA1SUM" .

Таким образом, в дополнение к явному расширению истории, eval также необходим, чтобы развернуть один слой цитирования.

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

Примечание. Вы можете быть удивлены, узнав, что двойные кавычки в приведенном выше определении псевдонима не нужны. Это потому, что между расширенным значением !$ и /SHA1SUM для запуска разбиения слов в bash. Тем не менее, мне нравится, когда они там, чтобы подчеркнуть намерение, что это распространяется на один аргумент.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .