我似乎还记得bash
有一个指称同一行中的东西的bang-shortcut。我知道并定期使用!$
,!!
和朋友。我记得阅读能够做以下操作:
mkdir tmp && cd !_
其中!_
代表我不记得的组合。(以上的目的是在成功后立即制作一个目录并立即进入 cd
。
现在我正在使用效率较低的
mkdir tmp
cd !$
哪个完成工作,但不是我想做的方式。
有人知道这个难以捉摸的快捷方式吗?
如果重要的话,我将zsh
与oh-my-zsh
一起使用,而不是Vanilla bash
。
mkdir tmp && cd "$_"
是您想要的,我相信(如果您确定不需要引用,则可以删除双引号)。
$_
在不同的上下文中的扩展不同,但是这里重要的是(从 man bash
,v3.2.51):
扩展后,将最后一个参数扩展到上一个命令。
背景:
注意:以下讨论bash
,但似乎也适用于zsh
。
$_
是一个所谓的特殊参数,您会在man bash
的Special Parameters
部分中找到其他列出的(没有$
前缀):
- 在交互式外壳和脚本中都可以工作。
- 在单个命令级别上工作,而不是在 line 级别。
相比之下, !
-prixed令牌(例如!$
回忆起最近行的最后一个令牌)与Shell的 [命令]历史扩展(man bash
的HISTORY EXPANSION
)有关
- 默认情况下,它们仅在交互式外壳中起作用,但是可以使用
set -o history
和set -o histexpand
(感谢,@chepner)更改。 - 在 line 级别上工作(更准确地说:用一个
Enter
键键提交的一切,无论其构成多少个单独的命令或行)。
!#
是指迄今为止的命令行,您可以从中提取特定单词:
mkdir tmp && cd !#:1
同一语法在zsh
中也起作用。
何处:
mkdir foo; cd $_
为我工作。
(老新闻
OP似乎正在寻找!#[X][-Y]
ZSH语法
其中x和y是当前行中历史事件中外壳单词的索引
x和y被认为是指线的开始或结尾 - 分别省略
时(请记住,在此上下文中的行末端实际上是该行中的!#[X][-Y]
事件调用的出现)
这为我们提供了以下变体:
!#
当前阵容至!#
!#-Y
当前阵容Y
-th Word!#X
X
-只有单词!#X-Y
单词X
通过Y
!#X-
来自X
- th word,直到!#X-
在直接响应给定的示例中:
mkdir tmp && cd !#2
或更进一步:
alias mktmpd='mkdir -p tmp /tmp/${PWD:t}; cd ${(@)${~:-${=^:-!#2-3}(N/)}[1]}; pwd; ls'
也将创建路径/tmp/${PWD:t}
,并用作cd
的替代方案,如果由于某种原因无法创建./tmp
(这会默默失败)
这是假设用户可以在/tmp
中使用mkdir
,并且愿意在./tmp
完全使用并且实际上选择
当/tmp/${PWD:t}
已经存在并且其内容无关并且不受干扰时会出现潜在问题,因此pwd; ls
混叠有助于用例,例如somecommand; mktmpd
,通常!#2-3将不再参考适当的参数tmp
/tmp/${PWD:t}
注意,我绝对不是主张这种用例是一个特别有用的案例(甚至是它的适应性,确实是一个例子 - 但我想指出别名的特殊性,因为我还没有看到其他地方提到过))