重新执行上一个命令,但使用不同的选项

时间:2016-06-14 08:44:41

标签: bash terminal

假设我尝试使用

删除目录
rm ./somedir

这会引发错误说

  

rm:random-scripts /:是一个目录

是否有重新执行上一个命令的快捷方式? (在这种情况下为-r

想知道是否有替代方法来点击箭头和编辑旧命令。

像这样:

  • !!重播最后一个命令。
  • sudo !!使用sudo重播最后一个命令。
  • !! some-argsome-arg作为参数重播最后一个命令。

3 个答案:

答案 0 :(得分:1)

你可以说:

ID   |   BALANCE   |   ACTION_QTY   |   ACTION_TYPE |   PRODUCT_ID   |
---------------------------------------------------------------------|
1    |     3       |       3        |       ADD     |       12       |
2    |     1       |       2        |       DEDUCT  |       12       |  
3    |     6       |       6        |       ADD     |       11       |      
4    |     9       |       3        |       ADD     |       11       | 
5    |     0       |       1        |       DEDUCT  |       12       | 
6    |     7       |       7        |       ADD     |       15       | 
7    |     6       |       1        |       DEDUCT  |       15       | 
8    |     9       |       3        |       ADD     |       15       | 
9    |     2       |       7        |       DEDUCT  |       11       |  
10   |     9       |       9        |       ADD     |       12       | 

这会扩展您之前的命令并将!rm -r 标志添加到其中。也就是说,它会说

-r

另一个例子:

rm ./somedir -r

答案 1 :(得分:1)

使用交互式历史记录扩展很简单(需要set -H,这是交互式会话中的默认值。)

重要提示:在您尝试进行历史记录扩展时(即使您未进行过实验),我建议您使用

启用histverify shell选项
shopt -s histverify

启用此选项后,

  

历史记录替换不会立即传递给shell解析器。而是将展开的行重新加载到Readline编辑缓冲区中以进行进一步修改。

(引自Bash Reference Manual)。事实上,我甚至建议您将shopt -s histverify放入.bashrc

如果您输入

rm dir1 dir2
你得到一个错误;实际上你的意思是rm -r dir1 dir2,这里有你如何修复命令:

  1. 您希望将字符串rm替换为rm -r

    !!:s/rm/& -r/
    

    <强>解释

    • !!指的是最后一个命令(使用!!比使用!更安全,因为!!强制执行替换 上一个命令,而不是 a 匹配上一个命令;以防万一)。列(:)是将事件指示符(此处为!!)与字指示符分隔开的字符(未使用 - 空 - 这里)和修饰符
    • 此处使用的修饰符为s/rm/& -r/,表示:替换rm的第一次出现并将其替换为自身(&),然后替换为-r

    当您输入此内容时(并且启用了histverify),您应该在readline缓冲区中包含以下行:

    rm -r dir1 dir2
    

    准备射击,光标位于该行的末尾。重复命令rm而不使用&

    可以实现同样的目的
    !!:s/rm/rm -r/
    
  2. 以较短的形式与上述相同:

    的快捷方式
    !!:s/old/new/
    

    ^old^new^
    

    因此,您可以输入以下内容:

    ^rm^& -r^
    

    它更加神秘,肯定会给你的小妹妹留下深刻的印象。

  3. 您希望保留所有参数(此处为dir1dir2)并将命令(即第0个字)替换为新命令(此处,替换命令) rmrm -r}:

    rm -r !!:1-$
    

    解释。 !!引用最后一个命令,该列是分隔符,与以前一样。但是现在,我们正在选择单词1-$的范围,即从第一个到最后一个(索引从0开始,因此命令rm是第0个字)。使用旧参数运行新命令非常方便。

  4. 使用快捷方式与上面相同:

    rm -r !!:*
    

    没错,*是范围1-$的快捷方式。

  5. 我在这里给的东西还有很多;我希望您能够理解并试验reference manual中提供的材料,这是一个良好的开端。

    在您的具体情况下,即

    rm ./somedir
    

    我根本不打扰历史扩展:shell有特殊变量_,它扩展到上一个命令的最后一个参数。所以输入

    rm -r "$_"
    

    会解决这个问题!但这仅适用于最后一个命令的最后一个参数...对于更多参数,您需要使用交互式历史记录工具。

答案 2 :(得分:0)

如果您正在使用像bash这样的现代shell,您应该可以使用向上箭头来获取最后一个命令(继续按下以前的命令),然后使用向左和向右箭头在命令文本中移动。您输入的任何内容都将插入光标位置 - 您可以使用BackSpace和Del键删除任何字符。