我可以使用shell别名来评估历史替换命令吗?

ico*_*ast 6 bash history alias zsh eval

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

rails new_project  
cd !!:1  
Run Code Online (Sandbox Code Playgroud)

第二行将进入"new_project"目录.

由于!!:1是尴尬的类型(尽管它很短,它需要三个转移键,就在键盘的两侧,然后这是输入的密钥的不移位版本两次移动),我想只需要输入的东西喜欢

cd-  
Run Code Online (Sandbox Code Playgroud)

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

alias cd-=!!:1  
Run Code Online (Sandbox Code Playgroud)

或者我将保存包含硬编码的"new_project"的别名.所以我试过了

alias cd-='!!:1'  
Run Code Online (Sandbox Code Playgroud)

这个问题是!!:1永远不会被评估,我得到一条消息,没有名为!!:1的目录.如何在我发布别名命令的时候制作别名来评估历史替换,而不是在我定义别名时,而不是从不?

(我在bash和zsh中都试过这个,并在两者中得到相同的结果.)

Ted*_*ddy 9

对于bash:

alias cd-='cd $(history -p !!:1)'
Run Code Online (Sandbox Code Playgroud)


Pau*_*ce. 8

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

对于最后一个论点:

cd Alt- .

要么

cd Esc .

对于第一个参数:

cd Alt- Ctrl-y

要么

cd Esc Ctrl- y


ZyX*_*ZyX 6

对于zsh:

alias cd-='cd ${${(z)$(fc -l -1)}[3]}'
Run Code Online (Sandbox Code Playgroud)

这是如何工作的:

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