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


19

所以,我用up我的壳(猛砸在OSX或Ubuntu,主要是),但在某些时候,我知道我想要的东西后,光标的当前位置。有什么办法可以使我完成的线与上面的线相同?击球up然后left令人讨厌。

除了tab,我们现在都在谈论其他技巧:

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

我键入mkdir /where/the/hell/is/that/thing,然后我要CD进入同一目录。但是现在我知道了meta-b了:)


1
一个明确的例子会很棒。
quack quixote


1
这是一个相关的(重复的)问题,答案很好:superuser.com/questions/124336/…–
cregox

Answers:


11

尝试这个:

mkdir /where/the/hell/is/that/thing

然后按alt+.

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

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

这比!!好多了!或!$,因为您实际上可以看到您将要运行的内容,并且无论如何它都减少了击键次数。

编辑:严格来说meta不是alt,所以它也可以与“ windows”键一起使用,具体取决于您的键盘设置方式。


有趣!不知道那一个。
quack quixote 2010年

2
@justin,太棒了。在OSX上,meta是转义符。
丹·罗森斯塔克

@yar对于OS X Terminal,在“设置”->“键盘”下还有一个首选项设置,以“将选项用作元键”。
ThomasW 2012年

谢谢@ThomasW我得回到这个东西。我每天都在命令行上,但是很少使用技巧。
丹·罗森斯塔克2012年

28

您应该通读系统上的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-在第n个在bash的历史记录列表命令,对于一些整数ñ(作品底片太)
  • !!-前面的命令;相当于!-1
  • !string-以字符串开头的最新命令

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

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

因此,以您的示例为例,如果您的最后一个命令是mkdir /some/really/long/path,则只需运行即可!!再次运行该命令。但是您想cd改成这条路:

$ cd !$

现在,假设您执行其他一些命令,然后又想返回该路径。如果这是您运行的最后一个mkdir命令,则可以使用此命令重复该路径:

$ tar czf ~/foo.tgz !mkdir:$

您还可以这些(和其他Readline命令)绑定到所需的任意组合键;请参阅手册的8.4节,可绑定的Readline命令:gnu.org/software/bash/manual/…和8.3节,Readline初始化文件:gnu.org/software/bash/manual/bashref.html#Readline-Init-File
quack quixote 2010年

谢谢,真的有帮助。尽管“阅读手册”是可以预料的,但提及绑定的基本操作确实有帮助。即使只是知道ctrl-a也是真正的节省。
Dan Rosenstark'2

@quack,没问题,实际上我后来进行了修订:)
Dan Rosenstark 2010年

1
还要注意bind -pbind -P将打印您当前的绑定;这是bash使用的最终参考。
quack quixote 2010年

1
我认为这个答案越来越大:“历史扩展”的内容很棒。
Dan Rosenstark 2010年

6

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

然后,您可以在键入后在命令行上执行各种强大的功能Esc + k

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

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

在这里进一步的帮助,在该链接上还有一些内置的bash东西,可能是您想要的东西。

干杯,斯图。


尽管vi模式对我来说毫无用处,但由于我尚未升级到vi,因此l墨水很棒。感谢那!
丹·罗森斯塔克

1
没有vi模式的等效项是ctrl-r。键入它,然后输入上一个命令。它将显示最后一次键入的内容。再次按ctrl-r转到下一个。非常便利。
Nerdfest 2010年

3

您可以使用!!代表最后一个命令的命令:

%测试
%回声!
>测试

有趣。不确定我是否要使用...什么来操纵该字符串?
丹·罗森斯塔克


2
当您忘记使用sudo时,这真的很有用:即sudo!-$更多/ etc / sudoers / etc / sudoers:权限被拒绝$ sudo!sudo更多/ etc / sudoers的
.s

@wookiebreath,非常感谢,我现在将这个答案投票
Dan Rosenstark 2010年

0

在您给出的示例中,使用!$表示上一个命令的最后一个参数:

mkdir /某物/某物

cd!$

您还可以使用编号的变体提取先前命令的特定参数。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.