Могу ли я использовать псевдоним оболочки для оценки команды подстановки истории?

Я пытаюсь написать псевдоним для cd !!:1, который берет второе слово предыдущей команды и переходит в каталог с этим именем. Например, если я наберу

rails new_project  
cd !!:1  

вторая строка будет перенесена в каталог «new_project».

Поскольку !!: 1 неудобно печатать (хотя он и короткий, для него требуются три клавиши SHIFT на противоположных сторонах клавиатуры, а затем версия клавиши без SHIFT, которая была набрана дважды SHIFT), я хочу просто напечатать что-нибудь как

cd-  

но поскольку !!:1 оценивается в командной строке, я (ОБЯЗАТЕЛЬНО) не могу просто сделать

alias cd-=!!:1  

или я бы сохранил псевдоним, содержащий жестко закодированный «new_project». Так что я попытался

alias cd-='!!:1'  

Проблема в том, что !!:1 НИКОГДА не оценивается, и я получаю сообщение о том, что каталог с именем !!:1 не существует. Как я могу создать псевдоним, в котором подстановка истории оценивается ВО ВРЕМЯ ВЫДАЧИ КОМАНДЫ алиаса, а не тогда, когда я определяю псевдоним, и не никогда?

(Я пробовал это как в bash, так и в zsh и получил одинаковые результаты в обоих.)


person iconoclast    schedule 09.04.2010    source источник
comment
Возможно то же самое в Unix: unix.stackexchange. com/questions/85352/how-can-i-alias-sudo/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 18.02.2015


Ответы (3)


Для ЗШ:

alias cd-='cd ${${(z)$(fc -l -1)}[3]}'

Как это работает:

  1. $(fc -l -1) оценивается. fc -l {start} [{end}] означает «список команд истории с {начала} до {конца} или последней, если {конец} отсутствует».
  2. ${(z)...} должен разбивать ... на массив точно так же, как это делает оболочка (см. «Флаги расширения параметров» в man zshexpn), но на самом деле он разбивается на пробелы. Возможно это только мой баг.
  3. ${...[3]} принимает третье значение из массива. Первое значение — это номер команды, второе — команда, а третье и последующие — аргументы.
person ZyX    schedule 10.04.2010
comment
Я только что сделал что-то подобное и получил fc ... | cut -d' ' -f4-, который удаляет начальный номер команды. - person Steven Lu; 29.03.2013

Для bash:

alias cd-='cd $(history -p !!:1)'
person Teddy    schedule 09.04.2010
comment
Очень красиво в баше: спасибо! К сожалению, это не работает в zsh. man history и history --help бесполезны, и я не смог ничего найти в Google... какие-нибудь идеи? - person iconoclast; 10.04.2010
comment
Я думал, что есть способ сделать это, используя обратные кавычки. например alias cd-='cd `!!:1`'. Что было бы более кратким (если бы я мог заставить его работать!) - person Carl G; 27.06.2012
comment
@DGGenuine: обратные кавычки и $() запускают команду; поэтому необходимо использовать встроенную историю. - person Teddy; 26.07.2012

Другой способ сделать то же самое:

Для последнего аргумента:

cd Alt-.

or

cd Esc .

Для первого аргумента:

cd Alt-Ctrl-y

or

cd Esc Ctrl-y

person Dennis Williamson    schedule 09.04.2010