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中都试过这个,并在两者中得到相同的结果.)
对于zsh:
alias cd-='cd ${${(z)$(fc -l -1)}[3]}'
Run Code Online (Sandbox Code Playgroud)
这是如何工作的:
$(fc -l -1)
被评估.fc -l {start} [{end}]
表示«列出从{start}到{end}的历史命令,如果{end}不存在,则列出最后的命令».${(z)...}
必须...
像shell一样拆分成一个数组(参见"参数扩展标志" man zshexpn
),但实际上它会在空白处分裂.也许这只是我的错误.${...[3]}
从数组中获取第三个值.第一个值是一个命令的数字,第二个是命令,第三个是后来的参数.