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 нет пробела . Тем не менее, мне нравится, когда они там, чтобы подчеркнуть намерение, что это распространяется на один аргумент.