2014-01-29 28 views
6

我似乎记得bash有一个引用同一行中的某个东西的bang-shortcut。我知道并定期使用!$!!和朋友。我记得读能够做到像下面这样:Bash引用同一行中的先前参数

mkdir tmp && cd !_ 

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

现在,我使用效率低的

mkdir tmp 
cd !$ 

它能够完成任务,但不是我想做到这一点。

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

万一它很重要,我用zshoh-my-zsh,而不是香草bash

回答

6
mkdir tmp && cd "$_" 

是你在找什么,我相信(如果你确定不需要报价,你可以放弃双引号)。

$_不同扩展在不同的语境,但一个重要的是在这里(从man bash,v3.2.51):

扩展到最后一个参数前面的命令,展开后。

背景

注:以下讨论bash,但它似乎适用于zsh原则为好。

$_是在man bashSpecial Parameters部分所谓特殊参数,其中你会发现在其他上市(不$前缀):

无论是在交互shell和脚本
  • 厂。
  • 作品在个别指挥等级,不在线等级。

相比之下,! -prefixed令牌(如!$回顾最近线的最后一个令牌)涉及到外壳的[命令]历史扩展(部分的man bashHISTORY EXPANSION):

  • 默认情况下,它们仅在交互式shell中工作,但可以使用set -o historyset -o histexpand(谢谢,@chepner)更改。
  • 工作在级别(更准确地说:无论包含多少个单独的命令或行,只需提交一个Enter按键即可提交的所有内容)。
1

这个怎么样:

mkdir foo; cd $_ 

为我工作。

5

!#指命令行,到目前为止,您可以从中提取特定的单词:

mkdir tmp && cd !#:1 

同样的语法在zsh工作为好。

+0

适用于这种情况,但''#:1'中的'1'是来自line_的_start的_absolute标记index_,这意味着解决方案不能很好地概括;例如'mkdir -p tmp/sub && cd!#:1'会中断;您必须注意并计算该行上的所有标记以找到正确的索引。另外,由于shell _expands_历史记录引用并将_expanded_命令存储在历史记录中(除了在执行前将其打印出来),您无法返回并按typed_编辑命令 - 例如创建另一个目录。 - 你只会得到_expanded_版​​本。 (接下来)。 – mklement0

+0

(续上)如果意图是获得_previous简单命令的__LAST_(扩展)令牌(如果不是,那么需要基于“!”的解决方案):当您使用时,所有这些问题都会消失'$ _',例如'mkdir -p tmp/sub && cd“$ _”'(为了安全,我用双引号'$ _')。我知道OP正在寻找您提供的历史扩展令牌,但考虑到这个问题的_intent_,我认为'$ _'是更好的选择。 – mklement0

+0

有一个shell选项('histverify'),允许您在执行命令之前编辑该命令。 '$ _' * only *在意图使用最后一个参数时有效。 '!#'可能需要更多的工作,但它可以和你可能使用的任何命令行一起工作。 – chepner

0

(旧闻,但万一别人的土地在这里寻找这一点,就像我只是做了)


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

,其中X和Y指标在历史事件壳字当前行

X和Y被假定为参考的开始或线的端部 - 分别 - 省略时

(记住,在这方面行尾实际上是!#[X][-Y]事件调用的线内发生)

这给了我们以下的变体:

  • !#当前排队!#

  • !#-Y当前行了Y个字

  • !#XX个字仅

  • !#X-Y词语X通过Y

  • !#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}

不过请注意,我决然不会提倡这种使用情况作为一个特别有用的一个(甚至它作为一个例子健身,真的 - 但是我想指出别名的特殊性,因为我还没有看到它在其他地方提到)