如何有效地在 bash 命令行中移动?

Dan*_*ark 19 keyboard-shortcuts bash

所以我up在我的 shell(主要是 OSX 或 Ubuntu 上的 Bash)中使用 ,但有时我知道我想要光标当前位置之后的东西。有什么办法可以让我所在的线路与上面的线路一起完成?打up然后left很烦人。

任何其他技巧也很酷,除了tab我们现在都在谈论的 :)

这是一个示例(根据 ~quack 的请求):

我输入mkdir /where/the/hell/is/that/thing,然后我想 cd 进入同一个目录。但现在我知道元 b :)

qua*_*ote 29

您应该通读系统上的man bash,尤其是Readline部分,因为这是 bash 的交互式输入机制。gnu.org上的Bash 手册有一个很好的关于命令行编辑的部分,这将有助于填补一些空白。

默认情况下,您可以使用它们在命令行上移动(这里只列出一些;查看完整列表的链接):

  • Ctrl+a移动到行首(或Home取决于终端设置)
  • Ctrl+e移动到行尾(或End...)
  • Meta+f向前移动一个“词”
  • Meta+b向后移动一个“单词”

您可以使用它们从一行中“杀死”(又名“剪切”)文本

  • Ctrl+k删除(“剪切”)从当前光标位置到行尾的文本
  • Ctrl+y将最近杀死的文本拉回(“粘贴”)光标处的缓冲区中

所以你可以结合这些来选择你想要重复的命令行块,杀死它,然后将它粘贴到下一个命令的末尾。


现在,为了让它更有趣,让我们考虑一下 bash 的History Expansion。这是!!Studer公司的回答中提到。历史扩展分解为事件指示符单词指示符修饰符

事件指示符如下所示(同样,请参阅完整列表的链接):

  • ! - 开始历史替换
  • !n- bash 历史列表中的第 n 个命令,用于某个整数n(也适用于负数)
  • !!- 前面的命令;相当于!-1
  • !string- 以字符串开头的最新命令

单词指示符从事件中选择某些部分。使用:该事件从字标志分开。单词从行首开始从 0 开始编号,并插入到当前行中,以单个空格分隔。

  • $- 指定最后一个参数(例如!!:$是最后一个命令的最后一个参数;可以缩短为!$
  • n-指定第n个字(例如!str:2是最近的命令开始的第二ARG STR ;!!:0在所述命令的最后一个命令的)

因此,为了跟进您的示例,如果您的最后一个命令是mkdir /some/really/long/path,则仅运行!!将再次重新运行该命令。但是你想cd进入那条路径:

$ cd !$
Run Code Online (Sandbox Code Playgroud)

现在假设您执行了一些其他命令,然后想再次引用该路径。如果这是您运行的最后一个mkdir命令,您可以使用它来重复该路径:

$ tar czf ~/foo.tgz !mkdir:$
Run Code Online (Sandbox Code Playgroud)

  • 还要注意`bind -p` 或`bind -P` 将打印您当前的键绑定;这是您的 *bash* 使用的最终参考。 (2认同)

use*_*307 11

尝试这个:

mkdir /where/the/hell/is/that/thing
Run Code Online (Sandbox Code Playgroud)

然后按alt+.

根据您的操作系统和终端上可能必须键入 esc然后.

您还可以按 alt+ 1+.选择特定的先前参数。

这比!!或 !$ 因为你实际上可以看到你将要运行的东西,而且它需要更少的击键。

编辑:严格来说它meta不是alt,所以它也可能与“windows”键一起工作,具体取决于你的键盘是如何设置的..

  • @justin 这太棒了。在 OSX 元是逃逸。 (2认同)

Stu*_*ock 6

如果您是 vi 用户,则可以通过键入将 shell 置于 vi 模式set -o vi

输入Esc + k.

我用的最多的一个是Esc+K那么/后斜线将被用来通过你的命令行历史记录搜索中键入任何文本。

例如,Esc + k /smbclient 将给出您输入的最后一个 smbclient 命令。您可以使用标准的六个键在所有搜索滚动(jk对上下,但我认为向上和向下箭头将工作太)。

此处的进一步帮助,该链接中还有一些内置的 bash 内容,它们可能更符合您的要求。

干杯,斯图。