Bash在同一行中引用前面的参数

Bash在同一行中引用前面的参数,bash,zsh,shortcut,Bash,Zsh,Shortcut,我似乎记得,bash有一个很好的快捷方式来引用同一行中的内容。我知道并使用$,和朋友定期联系。我记得Read能够做如下事情: mkdir tmp && cd !_ 其中_表示我不记得的组合。(上面的目标是创建一个目录,并在成功后立即cd)Google只会生成相同的2个参考表的重新发布,而这2个参考表没有这种组合 现在我用的是效率较低的 mkdir tmp cd !$ 它完成了任务,但不是我想要的方式 有人知道这条难以捉摸的捷径吗? 如果这很重要,我将zsh与oh my zsh

我似乎记得,
bash
有一个很好的快捷方式来引用同一行中的内容。我知道并使用
$
和朋友定期联系。我记得Read能够做如下事情:

mkdir tmp && cd !_
其中
_表示我不记得的组合。(上面的目标是创建一个目录,并在成功后立即
cd
)Google只会生成相同的2个参考表的重新发布,而这2个参考表没有这种组合

现在我用的是效率较低的

mkdir tmp
cd !$
它完成了任务,但不是我想要的方式

有人知道这条难以捉摸的捷径吗?

如果这很重要,我将
zsh
oh my zsh
一起使用,而不是香草
bash

mkdir tmp && cd "$_"
我相信这就是你想要的(如果你确定不需要引用,你可以去掉双引号)

$\ucode>在不同的上下文中进行了不同的扩展,但这里最重要的是(来自
man bash
,v3.2.51):

展开到展开后上一个命令的最后一个参数

背景

注意:下面讨论了
bash
,但它似乎在原则上也适用于
zsh

$
是一个所谓的特殊参数,您可以在
man bash
特殊参数
部分的其他参数中找到它(不带
$
前缀):

  • 可以在交互式shell和脚本中使用
  • 在单个命令级别工作,而不是在行级别
相比之下,
-前缀标记(例如
!$
以调用最近一行的最后一个标记)与shell的[command]历史扩展相关(man bash
历史扩展部分
):

  • 默认情况下,它们仅在交互式shell中工作,但可以通过
    set-o history
    set-o histexpand
    (谢谢,@chepner))进行更改
  • 在行级别工作(更准确地说:通过一次
    Enter
    击键提交的所有内容,无论它包含多少个单独的命令或行)
    • 这是怎么回事:

      mkdir foo; cd $_
      
      适合我。

      #引用了命令行,您可以从中提取特定的单词:

      mkdir tmp && cd !#:1
      
      同样的语法也适用于
      zsh

      (老消息,但万一有人来这里找这个,就像我刚才做的那样)


      OP似乎在寻找
      #[十] [-Y]
      zsh语法

      其中X和Y是当前行的历史事件中shell字的索引

      假设X和Y是指直线的起点或终点- 分别-省略时

      (请记住,此上下文中的行尾实际上是行内发生的
      !#[X][Y]
      事件调用)

      这为我们提供了以下变体:

      • #当前行到
        #

      • #-Y
        当前排列第Y个字

      • #X
        X
        -仅限第个单词

      • #X-Y
        words
        X
        Y

      • #X-
        X
        -第个单词,直到
        #X-

      直接响应给出的示例: 或者,更进一步:

      alias mktmpd='mkdir -p tmp /tmp/${PWD:t}; cd ${(@)${~:-${=^:-!#2-3}(N/)}[1]}; pwd; ls'
      
      路径
      /tmp/${PWD:t}
      也将被创建,如果由于某种原因无法创建
      /tmp
      ,则该路径将作为
      cd
      的替代路径(该路径将以静默方式失败)

      这假设用户可以在
      /tmp
      mkdir
      ,并愿意在
      /tmp
      完全可用且事实上已选择时生成一些无用的路径(并保持不变)

      /tmp/${PWD:t}
      已经存在且其内容无关且不受干扰时,会出现潜在问题,因此
      PWD;ls

      别名有助于处理用例,例如
      somecommand;mktmpd
      通常情况下#2-3将不再引用适当的参数
      tmp
      /tmp/${PWD:t}


      但是请注意,我坚决不主张将此用例作为一个特别有用的用例(或者说它的适用性作为一个例子,真的-但我想指出别名的特殊性,因为我还没有在其他地方提到过它)

      在手边的用例中工作得很好,但是
      中的
      1
      !\1
      是从行首开始的绝对标记索引,这意味着解决方案的通用性不好;e、 例如,
      mkdir-ptmp/sub&&cd!#1
      会断裂;您必须注意并计算行中的所有标记,以找到正确的索引。此外,由于shell扩展了历史引用并将扩展的命令存储在历史记录中(除了在执行之前打印它之外),因此您无法返回并编辑键入的命令-例如,创建另一个目录。-你只能得到扩展版。(下面继续)。(上面继续)如果目的是获取上一个简单命令的最后(扩展)令牌(如果不是,则需要基于
      的解决方案):当您使用
      $
      时,所有这些问题都会消失,例如
      mkdir-p tmp/sub&&cd“$”
      (为了安全起见,我双引号
      $
      )。我知道OP正在寻找您提供的历史扩展令牌,但考虑到问题的意图,我认为
      $\uucode>是更好的选择。有一个shell选项(
      histverify
      )允许您在执行命令之前编辑命令<代码>$\uuu
      仅在意图使用最后一个参数时有效<代码>#可能需要更多的工作,但它可以与您可能使用的任何命令行一起工作;不知道shopt-s histverify
      -handy(对于bash;zsh等价物:alias mktmpd='mkdir -p tmp /tmp/${PWD:t}; cd ${(@)${~:-${=^:-!#2-3}(N/)}[1]}; pwd; ls'