bash参考同一行中的先前参数



我似乎还记得bash有一个指称同一行中的东西的bang-shortcut。我知道并定期使用!$!!和朋友。我记得阅读能够做以下操作:

mkdir tmp && cd !_

其中!_代表我不记得的组合。(以上的目的是在成功后立即制作一个目录并立即进入 cd

现在我正在使用效率较低的

mkdir tmp
cd !$

哪个完成工作,但不是我想做的方式。

有人知道这个难以捉摸的快捷方式吗?

如果重要的话,我将zshoh-my-zsh一起使用,而不是Vanilla bash

mkdir tmp && cd "$_"

是您想要的,我相信(如果您确定不需要引用,则可以删除双引号)。

$_在不同的上下文中的扩展不同,但是这里重要的是(从 man bash,v3.2.51):

扩展后,将最后一个参数扩展到上一个命令。

背景

注意:以下讨论bash,但似乎也适用于zsh

$_是一个所谓的特殊参数,您会在man bashSpecial Parameters部分中找到其他列出的(没有$前缀):

  • 在交互式外壳和脚本中都可以工作。
  • 单个命令级别上工作,而不是在 line 级别。

相比之下, ! -prixed令牌(例如!$回忆起最近行的最后一个令牌)与Shell的 [命令]历史扩展man bashHISTORY EXPANSION)有关

  • 默认情况下,它们仅在交互式外壳中起作用,但是可以使用set -o historyset -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}

注意,我绝对不是主张这种用例是一个特别有用的案例(甚至是它的适应性,确实是一个例子 - 但我想指出别名的特殊性,因为我还没有看到其他地方提到过))

相关内容

  • 没有找到相关文章

最新更新