假设我尝试使用
删除目录rm ./somedir
这会引发错误说
rm:random-scripts /:是一个目录
是否有重新执行上一个命令的快捷方式? (在这种情况下为-r
)
想知道是否有替代方法来点击箭头和编辑旧命令。
像这样:
!!
重播最后一个命令。 sudo !!
使用sudo重播最后一个命令。!! some-arg
以some-arg
作为参数重播最后一个命令。答案 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
,这里有你如何修复命令:
您希望将字符串rm
替换为rm -r
:
!!:s/rm/& -r/
<强>解释强>
!!
指的是最后一个命令(使用!!
比使用!
更安全,因为!!
强制执行替换 上一个命令,而不是 a 匹配上一个命令;以防万一)。列(:
)是将事件指示符(此处为!!
)与字指示符分隔开的字符(未使用 - 空 - 这里)和修饰符。s/rm/& -r/
,表示:替换rm
的第一次出现并将其替换为自身(&
),然后替换为-r
。当您输入此内容时(并且启用了histverify
),您应该在readline缓冲区中包含以下行:
rm -r dir1 dir2
准备射击,光标位于该行的末尾。重复命令rm
而不使用&
:
!!:s/rm/rm -r/
以较短的形式与上述相同:
的快捷方式!!:s/old/new/
是
^old^new^
因此,您可以输入以下内容:
^rm^& -r^
它更加神秘,肯定会给你的小妹妹留下深刻的印象。
您希望保留所有参数(此处为dir1
和dir2
)并将命令(即第0个字)替换为新命令(此处,替换命令) rm
与rm -r
}:
rm -r !!:1-$
解释。 !!
引用最后一个命令,该列是分隔符,与以前一样。但是现在,我们正在选择单词1-$
的范围,即从第一个到最后一个(索引从0
开始,因此命令rm
是第0个字)。使用旧参数运行新命令非常方便。
使用快捷方式与上面相同:
rm -r !!:*
没错,*
是范围1-$
的快捷方式。
我在这里给的东西还有很多;我希望您能够理解并试验reference manual中提供的材料,这是一个良好的开端。
在您的具体情况下,即
rm ./somedir
我根本不打扰历史扩展:shell有特殊变量_
,它扩展到上一个命令的最后一个参数。所以输入
rm -r "$_"
会解决这个问题!但这仅适用于最后一个命令的最后一个参数...对于更多参数,您需要使用交互式历史记录工具。
答案 2 :(得分:0)
如果您正在使用像bash
这样的现代shell,您应该可以使用向上箭头来获取最后一个命令(继续按下以前的命令),然后使用向左和向右箭头在命令文本中移动。您输入的任何内容都将插入光标位置 - 您可以使用BackSpace和Del键删除任何字符。