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

时间:2014-01-29 16:44:17

标签: bash zsh shortcut

我似乎记得bash有一个快捷方式,用于引用同一行中的某些内容。我知道并定期使用!$!!和朋友。我记得阅读能够做如下的事情:

mkdir tmp && cd !_

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

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

mkdir tmp
cd !$

完成工作但不是我想要的方式。

有谁知道这个难以捉摸的捷径?

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

4 个答案:

答案 0 :(得分:7)

mkdir tmp && cd "$_"
我相信

是您正在寻找的(如果您确定不需要报价,可以删除双引号。)

$_在不同的上下文中有不同的扩展,但在此重要的是(来自man bash,v3.2.51):

  扩展后,

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

<强>背景

注意:以下内容讨论bash,但原则上似乎也适用于zsh

$_是一个所谓的特殊参数,您可以在$部分的Special Parameters部分中列出其他参数(不包含man bash前缀) !

  • 在交互式shell和脚本中都可以使用。
  • 个别命令级别工作,而不是在级别工作。

相比之下,!$ - 前缀标记(例如HISTORY EXPANSION以调用最近行的最后一个标记)与shell的 [命令]历史记录扩展相关(部分{ {1}}的{​​1}}:

  • 默认情况下,它们仅适用于交互式shell,但可以使用man bashset -o history进行更改(感谢@chepner)。
  • 级别工作(更准确地说:通过一次set -o histexpand击键提交的所有内容,无论它包含多少个别命令或行,都是如此。

答案 1 :(得分:6)

到目前为止,

!#指的是命令行,您可以从中提取特定的单词:

mkdir tmp && cd !#:1

同样的语法也适用于zsh

答案 2 :(得分:1)

这个怎么样:

mkdir foo; cd $_

适合我。

答案 3 :(得分:0)

(旧消息,但万一有人在这里寻找这个,就像我刚才那样)

OP似乎正在寻找!#[X][-Y] zsh语法

其中X和Y是当前行

的历史事件中shell单词的索引

假设X和Y指的是行的开头或结尾 -  分别 - 省略时

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

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

  • !# 目前排到!#

  • !#-Y 当前排队Y - 字

  • !#X X - 仅限

  • !#X-Y XY

  • !#X- X开始,直到!#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(这将无声地失败)

这假设用户可以在mkdir/tmp,并且当./tmp完全可用并且实际上已选择

时,他愿意让一些无用的路径生成(并保持不变)

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

别名有助于somecommand; mktmpd这样的用例,通常情况下!#2-3将不再引用相应的参数tmp /tmp/${PWD:t}

但请注意,我绝对不提倡将此用例作为一个特别有用的用例(或者甚至它的适用性作为一个例子,真的 - 但我想指出别名的特殊性,因为我还没有看到它在其他地方提到过)