如何在bash控制台上重复当前输入的参数?

k0p*_*kus 25 bash readline line-editor

我只是在输入以下内容:

mv foo/bar/poit/zoid/narf.txt
Run Code Online (Sandbox Code Playgroud)

突然意识到,该死的,我必须再次输入该参数的大部分内容

mv foo/bar/poit/zoid/narf.txt foo/bar/poit/zoid/troz.txt
Run Code Online (Sandbox Code Playgroud)

即使使用tabcompletion,也很痛苦。我知道我可以通过鼠标选择文本和中键来复制粘贴参数,但这还不够好。我想留在键盘上。

那么有没有办法使用键盘复制粘贴该行的当前参数?

小智 25

历史扩展实际上也适用于当前命令,使用事件指示符!#。将此与最后一个参数的单词指示符结合使用 - $- 以获取您刚刚输入的参数。并且您可以对它使用所有常规修饰符,因此,例如,如果您要重命名远处目录中的文件,则只需键入:

mv path/you/do/not/want/to/type/twice/oldname !#$:h/newname
Run Code Online (Sandbox Code Playgroud)

  • @SorenBjornstad `alt+backspace` 通常已经停止在斜杠等单词分隔符处,因此您无需更改 `^W` 来获取该功能,您可以删除非单词字符或空格分隔的单词 (2认同)

jw0*_*013 19

如果我提前计划,我会使用大括号扩展。在这种情况下:

mv foo/bar/poit/zoid/{narf,troz}.txt
Run Code Online (Sandbox Code Playgroud)

这是使用默认readline键盘快捷键的另一种方法:

  • mv foo/bar/poit/soid/narf.txt: 开始
  • Ctrl- w:unix-word-rubout删除foo/bar/poit/soid/narf.txt
  • Ctrl- y, Space, Ctrl- y: yank, 空格,yank再次得到mv foo/bar/poit/soid/narf.txt foo/bar/poit/soid/narf.txt
  • Meta- backspace, Meta- backspace:backward-kill-word两次删除最后一个narf.txt
  • troz.txt: 输入不同的尾部

如果您花费大量时间使用bashshell,我建议您定期通读默认快捷方式列表,并挑选出一些对学习和融入日常工作有用的方法。 手册的第 8 章bash是一个很好的起点。知道捷径真的可以提高你的效率。

  • @k0pernikus 是的,在大多数键盘上,Alt 键是 Meta 键。 (3认同)
  • 要保存重新键入 `.txt`,您可以按 Ctrl+Left(或任何其他调用 `backward-word` 的快捷方式),然后按左一个字符,然后按 Alt+Backspace 并键入 `troz`。 (2认同)

rus*_*ush 14

在您的示例中,您可以使用下一个构造:

mv foo/bar/poit/zoid/{narf.txt,troz.txt}
Run Code Online (Sandbox Code Playgroud)

甚至(如建议的Ansgar Esztermann):

mv foo/bar/poit/zoid/{narf,troz}.txt
Run Code Online (Sandbox Code Playgroud)

而不是键入/复制粘贴长地址两次。

  • 这称为 [支撑扩展](http://www.gnu.org/software/bash/manual/bashref.html#Brace-Expansion)。 (2认同)

k0p*_*kus 7

玩弄我得到了这个工作:

mv foo/bar/poit/zoid/narf.txt
Run Code Online (Sandbox Code Playgroud)

点击Enter
以存储最后一个参数。

现在用于?获取最后一次输入的行返回。输入一个空格并获取上次使用的参数,请使用:

Alt + .

我讨厌引发错误,但它在这个用例中完成了工作。


nis*_*ama 6

这将插入 Readline 行缓冲区的最后一个字。!#是当前行,:$是最后一个字,\e^history-expand-line

"\ej":"!#:$\e^"
Run Code Online (Sandbox Code Playgroud)

当您在单词中间时,这也有效,并且不需要手动插入空格,但它的缺点是它会覆盖终止环:

"\ee":shell-backward-word
"\ei":shell-forward-word
"\ew":copy-region-as-kill
"\ej":"\ee\e \ei\ew \C-y"
Run Code Online (Sandbox Code Playgroud)

为了复制之前的以空格分隔的单词而不是 shell 单词,您可以使用\C-w\C-y\C-y. \C-w向后删除以空格分隔的单词。

  • 这应该被标记为答案。现在按“alt/option + j”会复制最后一个单词。 (2认同)