Могу ли я иметь псевдоним оболочки для команды подстановки истории? - PullRequest
6 голосов
/ 09 апреля 2010

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

rails new_project  
cd !!:1  

вторая строка перейдет в каталог "new_project".

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

cd-  

но поскольку !!: 1 вычисляется в командной строке, я (ЯВНО) не могу просто сделать

alias cd-=!!:1  

или я бы сохранил псевдоним, содержащий жестко запрограммированный в нем "new_project". Поэтому я попытался

alias cd-='!!:1'  

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

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

Ответы [ 3 ]

9 голосов
/ 09 апреля 2010

Для Баш :

alias cd-='cd $(history -p !!:1)'
8 голосов
/ 09 апреля 2010

Еще один способ сделать то же самое:

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

cd Доп. - .

или

cd Esc .

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

cd Alt - Ctrl - y

или

cd Esc Ctrl - y

6 голосов
/ 10 апреля 2010

для зш:

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

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

  1. $(fc -l -1) оценивается. fc -l {start} [{end}] означает «вывести список команд истории с {start} до {end} или последним, если {end} отсутствует».
  2. ${(z)...} должен разделить ... на массив, как это делает оболочка (см. «Флаги расширения параметров» в man zshexpn), но на самом деле он разбивается на пробелы. Может быть, это только моя ошибка.
  3. ${...[3]} принимает третье значение из массива. Первое значение - это номер команды, второе - команда, а третье и более поздние аргументы.
...