Bash 可以让shell别名计算历史替换命令吗?

Bash 可以让shell别名计算历史替换命令吗?,bash,history,eval,alias,zsh,Bash,History,Eval,Alias,Zsh,我正在尝试为cd编写别名!!:1,它接受上一个命令的第二个字,并更改为该名称的目录。例如,如果我键入 rails new_project cd !!:1 第二行将cd放入“new_project”目录 自从!!:1很难输入(虽然它很短,但需要在键盘的另一侧输入三个移位键,然后输入两个移位键的未移位版本),我只想输入以下内容 cd- 但是自从1是在命令行上计算的,我(显然)不能这样做 alias cd-=!!:1 或者我会保存一个包含“new_project”硬编码的别名。所

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

rails new_project  
cd !!:1  
第二行将cd放入“new_project”目录

自从!!:1很难输入(虽然它很短,但需要在键盘的另一侧输入三个移位键,然后输入两个移位键的未移位版本),我只想输入以下内容

cd-  
但是自从1是在命令行上计算的,我(显然)不能这样做

alias cd-=!!:1  
或者我会保存一个包含“new_project”硬编码的别名。所以我试过了

alias cd-='!!:1'  
这样做的问题是!!:1从未计算过,我收到一条消息,没有名为的目录!!:1存在。如果在发出alias命令时计算历史替换,而不是在定义别名时计算,那么如何生成别名

(我在bash和zsh中都试过,结果都一样。)

对于bash

alias cd-='cd $(history -p !!:1)'

完成相同任务的另一种方法:

关于最后一个论点:

cd
Alt-

cd
Esc

对于第一个论点:

cd
Alt-Ctrl-y

cd
Esc Ctrl-y

对于zsh:

alias cd-='cd ${${(z)$(fc -l -1)}[3]}'
工作原理:

  • $(fc-l-1)
    进行评估
    fc-l{start}[{end}]
    表示«列出从{start}到{end}或最后一个(如果{end}不存在)的历史命令»
  • ${(z)…}
    必须像shell一样将
    ..
    拆分为一个数组(请参见
    man zshexpn
    中的«参数扩展标志»),但实际上它是在空白处拆分的。也许这只是我的错误
  • ${…[3]}
    从数组中获取第三个值。第一个值是命令的数字,第二个值是命令,第三个值和以后的值是参数

  • 非常好,谢谢!不幸的是,它在zsh中不起作用。人类历史和历史——帮助是无用的,我还没能通过谷歌搜索找到任何东西。。。有什么想法吗?我还以为有一种方法可以用反引号来实现呢。e、 g.
    alias cd-='cd`!!:1`
    。哪一个更简洁(如果我能让它工作的话!)@dgreensive:Backquotes和$()运行命令;因此必须使用“历史”内置项。我只是做了一些类似的事情,结果是
    fc…|剪切-d'-f4-
    ,删除命令的前导编号。在Unix上可能相同: