6

我正在尝试为 cd !!:1 编写一个别名,它采用上一个命令的第二个单词,并更改为该名称的目录。例如,如果我输入

rails new_project  
cd !!:1  

第二行将 cd 进入“new_project”目录。

由于 !!:1 打字很尴尬(即使它很短,它需要三个 SHIFTed 键,在键盘的相对两侧,然后是键入两次 SHIFTed 的键的未SHIFT版本),我只想输入一些东西像

cd-  

但是由于 !!:1 是在命令行上评估的,所以我(显然)不能这样做

alias cd-=!!:1  

或者我会保存一个包含硬编码的“new_project”的别名。所以我尝试了

alias cd-='!!:1'  

问题在于 !!:1 从未评估过,并且我收到一条消息,指出不存在名为 !!:1 的目录。如何创建一个别名,在我发出别名命令时评估历史替换,而不是在我定义别名时,而不是从不?

(我在 bash 和 zsh 中都尝试过,并且在两者中都得到了相同的结果。)

4

3 回答 3

9

对于bash

alias cd-='cd $(history -p !!:1)'
于 2010-04-09T16:37:35.943 回答
8

完成同样事情的另一种方法:

对于最后一个参数:

cd Alt-.

或者

cd Esc .

对于第一个论点:

cd Alt- Ctrl-y

或者

cd Esc Ctrl-y

于 2010-04-09T16:57:20.890 回答
6

对于 zsh:

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

这是如何工作的:

  1. $(fc -l -1)被评估。fc -l {start} [{end}]表示«列出从 {start} 到 {end} 的历史命令,如果 {end} 不存在,则为最后一个»。
  2. ${(z)...}必须...像 shell 一样拆分成一个数组(参见 中的 «参数扩展标志» man zshexpn),但实际上它拆分为空白。也许这只是我的错误。
  3. ${...[3]}从数组中获取第三个值。第一个值是命令的编号,第二个是命令,第三个是参数。
于 2010-04-10T10:31:47.520 回答