如何使用Shell bang运算符在同一命令行上引用以前的命令

时间:2018-09-21 17:15:28

标签: bash zsh

让我们假设我在同一命令行上将两个命令串在一起,并且我不想两次键入参数。我该怎么做?

chmod u+x /some/obnoxiously/long/path && vim <WHAT_GOES_HERE?>

如果我在两行中键入此内容,解决方案将为!$

chmod u+x /some/obnoxiously/long/path 
vim !$

但是!$从最后输入的中获取最后一个参数,而不是最后执行的命令。我想要一种在chmod之前的同一行上获取&&命令的最后一个参数的方法。我确定我不是第一个想要这个的人。 Bash或Zsh(或任何其他Shell)有某种方法可以帮我吗?

TLDR:您可以跳过以下所有内容。与问题本身相关的所有内容都在上方。


我为什么要这个? (我知道有人会问。)有很多原因。

有时第一个命令需要一段时间才能运行,我想立即键入我正在考虑的所有命令,以便在第一个命令运行时将注意力转移到其他地方。我正在等待的这段时间为某些东西打断我的思考过程提供了巨大的机会。有时是办公室或家里的另一个人,有时是另一个念头在我脑海中,有时又是我计算机上的其他东西正在消失并使我分心。心理流的中断是生产力的中断。立即将其全部清除可以避免这种情况。

有时候,即使第一个命令可能几乎是瞬时的(与chmod一样),我也只是想将整个指令集传递给shell。可能看起来好像输入两个用&&分隔的东西和用 return 分隔的两个东西一样,但这是错误的。该过程如下:

  1. 键入命令;
  2. 认真检查命令,以确保没有错误或遗漏;
  3. 点击 return ;
  4. 让计算机执行命令;
  5. 使用下一个命令重复。

通过使用&&,我可以在进入步骤2、3和4之前键入两个命令。通过使用&&,我知道如果第一个命令失败,则第二个命令将不会运行。

1 个答案:

答案 0 :(得分:3)

那里是$_

$ echo chmod u+x /some/obnoxiously/long/path && echo vim "$_"
chmod u+x /some/obnoxiously/long/path
vim /some/obnoxiously/long/path

这里是man bash

   Special Parameters
   _      [...] expands to the last argument to the previous com‐
          mand, after expansion. [...]