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

Опитвам се да напиша псевдоним за cd !!:1, който взема втората дума от предишната команда и се променя в директорията с това име. Например, ако пиша

rails new_project  
cd !!:1  

вторият ред ще бъде CD в директорията "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)


За zsh:

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]} взема трета стойност от масива. Първата стойност е номер на команда, втората е команда, а третата и по-късните са аргументи.
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
Много хубаво в bash: благодаря! За съжаление не работи в zsh. история на човека и история --помощта е безполезна и не можах да намеря нищо чрез 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