我经常发现自己处于以下位置:我已经开始在bash提示符下键入一个长命令,但是到一半时,我发现需要使用另一个命令检查某些内容。当我在控制台(不是X)时(通常是这种情况),这是一个问题,因为那时我只有以下几种令人满意的方法,我知道:


点击ctrl + alt + F2并登录另一个虚拟控制台,找出我想要的内容,然后返回并继续
ctrl + a,键入echo + space + enter,找出原因我想按↑直到找到我的命令ctrl + a,del x 5,ctrl + e,然后继续

突出显示到目前为止我用鼠标键入的内容(如果gpm正在运行,通常是这样),请按ctrl + c中断,在不小心用鼠标突出显示内容的同时找出我想要的内容,然后在新的提示上按鼠标中键并继续

祈祷向命令行之神说,半写命令不会产生任何不良影响,而只是失败,然后小心地按Enter键,然后找出我想要的内容,按向上箭头,直到我得到命令,然后继续

跳入我的时间机器,回到过去并提醒我在开始键入命令之前先启动屏幕,回到现在,按ctrl + ac,找出我想要的内容,按ctrl + a ctrl + a,然后继续


我想知道的是,是否有一些更优雅的方法?某种subshel​​l命令或类似命令?

我对不需要任何准备或设置即可工作的方法最感兴趣。

#1 楼

alex的Ctrl + A Ctrl + K(移到该行的前面,然后将所有内容向前剪切)的更快版本是仅使用Ctrl + U,它在bash上向后剪切,并且整行(无论当前状态如何)位置)在zsh上。然后使用Ctrl + Y再次粘贴

评论


通过测试,我得出结论Ctrl + U不会后退并向前切,而是向后切。将光标放在命令的中间将使命令行后面的内容消失。但是,与@alex的解决方案相比,仍节省了33%,因为它节省了按键操作。

–Lauritz V. Thaulow
2011年4月7日在21:18

@lazyr哦,非常正确;在zsh上,它确实剪切了整行,但在bash上,它向后剪切。我以前从未注意到这种差异

– Michael Mrozek
2011年4月7日在21:20

哦,我不知道Ctrl + U还会把文本杀死缓冲区。很高兴知道! :)

– alex
2011年4月8日在6:10



^ U ^ K将具有与^ A ^ K相同的效果,但在人机工程学上要略微多一些,并且在屏幕下更加方便。

–直觉
2011年4月19日下午5:04

#2 楼

执行ctrl-A可以开始到行首,添加一个哈希并按回车键-这样,它将作为注释保留在命令历史记录中,并且可以使用向上光标将其返回

编辑:刚刚注意到,这是您#2上稍微优雅的变体;)

评论


是的,为什么我没有想到呢?谢谢!

–Lauritz V. Thaulow
2011年4月7日在14:03

在发布自己的答案之前,我需要阅读。詹姆斯说对了。

– Sean C.
2011年4月7日在16:53

请注意,这在csh或zsh中将不起作用,因为它们不允许在交互式shell中进行注释。在zsh中,您需要激活适当的选项:setopt Interactive_comments。

–sam hocevar
2011年4月7日19:56

@Sam是,但是“:命令”具有相同的效果(“:” =空命令)

–user2267
2011年4月8日在14:09

@barrycarter:不,:出于此目的,应该被认为是有害的,决不建议这样做。它将执行分号,反引号等内部的所有操作,并具有所有相关的副作用。

–sam hocevar
2011年4月8日在16:35

#3 楼

Ctrl+ACtrl+K移至行首,然后删除(杀死)至行尾。然后进行研究,并准备好继续时,按Ctrl+Y(猛拉)将保存的(杀死)的线放回去。

评论


嗯,现在这更像是我的想法。而且我一直在Emacs中这样做,应该考虑在命令行上执行相同的操作。

–Lauritz V. Thaulow
2011年4月7日在18:50

#4 楼

在zsh中,我键入Ctrl + Z来“暂停”我正在键入的命令,然后键入另一个命令。在运行该命令(或使用Ctrl + C中止该命令)之后,已暂停的命令将返回以进行编辑(甚至记住光标位置)。为了进一步方便起见,如果在键入Ctrl + Z时命令行为空,则该键将调用内置的bg(因此,按Ctrl + Z的双键会将正在运行的命令直接发送到后台)。

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z


我不知道如何在bash中执行类似的操作。

在任何shell中,都可以使用低技术含量的方法在bash处添加#当前行的开头。

评论


您的功能令人赞叹,但是您知道zsh已经为内置的功能提供了功能吗?这就是所谓的推线式,您所需要做的就是使用bindkey来实现。

–卡莱布
2011-4-25 17:42

@Caleb:我不知道为什么在这里我使用推入式输入而不是推入式输入,推入式输入似乎更合适(也许旧版本的zsh仅具有推入式输入?)。但这不能替代其余功能。

–吉尔斯'所以-不再是邪恶的'
2011年4月25日在18:17

据我所知,唯一的区别是对正在运行的作业的后台具有相同的绑定效果。我想念什么吗?

–卡莱布
2011年4月25日在18:20

@Caleb:不,只是我发现两者的组合很方便(在空行上推行没用,在Ctrl + Z上使用bg仅在我刚刚用Ctrl + Z暂停该过程时才有用)和助记符(我在后台运行进程或部分命令行)。

–吉尔斯'所以-不再是邪恶的'
2011年4月25日在20:39

@Caleb push-input挂起整个输入缓冲区,而push-line仅挂起当前行。如果输入多行命令,我想暂停整个命令,因此push-input是正确的命令。我发现推入式输入比推入式输入更有用(如果我想在多行输入缓冲区中延迟一行,我可以直接导航到该行的开头并插入换行符),因此我实际上想知道为什么推入式输入行具有默认的键盘绑定,而不是推式输入。

–吉尔斯'所以-不再是邪恶的'
13年5月2日,9:50

#5 楼

在bash中,只需键入Alt +#。

,然后在准备好时按Up,然后按Alt +#。

第一个在行的开头放置#将其转换为注释,然后接受该行,就像您按Enter键一样。

然后,当您第二次执行该操作时,它会看到该行的开头已经有一个#,因此将其删除它并接受它,再次保存您的Enter键。

如果第二次仅插入另一个#,则必须键入Alt +-Alt +#。

您可以通过在您的〜/ .zshrc中放置

bindkey -M emacs '\e#' pound-insert


来使zsh做同样的事情。

或者,如果您使用vi绑定,则可以可以在bash和zsh的命令模式下键入#。

评论


对我不起作用,第二个命令是删除#号,而只是在前面添加了#号。

–Lauritz V. Thaulow
2011年4月7日在21:14

第一个工作吗?您正在使用什么版本的bash?

– Mikel
2011年4月7日在21:19

Alt +#的工作方式与您在第三段中描述的相同,但与第四段中的描述不同,它只是在前面加上另一个#并接受该行。我在Ubuntu 10.10上使用bash 4.1.5(1)-发行版。

–Lauritz V. Thaulow
2011年4月7日在21:24

哦,亲爱的,在bash中,它需要一个数字参数,例如按Esc + 1,然后按Alt +#进行切换。

– Mikel
2011年4月7日在21:30

可以,但是比Ctrl + A Del Ctrl + E麻烦得多,尤其是在我的键盘布局上,其中Alt +#实际上是Alt + Shift + 3。

–Lauritz V. Thaulow
2011年4月7日在21:39

#6 楼

我在zsh中最喜欢的功能之一是内置的推入式功能,无需其他任何答案即可解决此问题。我将它绑定到我的.zshrc文件中的Ctrl + l上,如下所示:

bindkey '^L' push-line


然后,当我在某些命令中键入内容并且需要快速执行其他操作时我可以用一个键调用它,并得到一个空白提示。运行其他命令后,提示会自动填充我之前输入的内容。

您甚至可以将其多层链接,并且命令会以相反的顺序返回给您进入队列。

评论


默认情况下绑定到Ctrl + Q和ESC q(在emacs模式下)。

–吉尔斯'所以-不再是邪恶的'
2011年4月25日在20:37

bash有类似的东西吗?

–马格努斯
2012年10月1日13:53

@Magnus:请查看该问题的其余答案。有一些针对bash的解决方案,只是不够优雅。

–卡莱布
2012年10月1日13:58

@Caleb,我应该更具体一些,bash是否有类似的单键组合?

–马格努斯
2012年10月1日14:11

无论如何,这显然是Zsh的“正确”答案!我只想提及“推入或编辑”小部件,默认情况下,该小部件未绑定在任何按键图中。在最高级别的提示下,它执行与推线相同的操作,但是在任何较低级别的提示下,它将将输入的整个命令转换为多行缓冲区。一个键绑定具有两个强大的功能!我建议绑定而不是普通的推线或编辑推线。您将一无所获,并获得有用的功能。

– wjv
16年4月5日在7:38

#7 楼

除了ctrl-a ctrl-k技巧外,如果您在屏幕上,只需按ctrl-a d即可分离,然后重新连接screen -r

还可以使用ctrl + ac <打开另一个窗口br />

评论


如果您在屏幕上,只需使用Ctrl + A c打开另一个窗口。

–吉尔斯'所以-不再是邪恶的'
2011年4月7日在23:12

@Gilles ..除非您需要使用Shell状态的某些方面(变量,函数,别名等)。

–直觉
2011年4月19日下午5:05

#8 楼

另一种方法,虽然不完美,请按Ctrl-X Ctrl-E。这将打开您的默认编辑器,其中包含半键入命令。然后,您可以将命令保存到文件中,或从编辑器中打开新的外壳。当您退出新外壳程序时,它将返回到编辑器,保存内容将自动执行它们。

这并不完美,因为它不会使您返回到原始外壳程序,但是会强制执行执行该命令或将其完全丢弃。但是没有临时选择或终止缓冲区的问题,也有一些不错的调整,例如如果editor = vi

:wq            # execute the command
:cq            # cancel and abort
:! command     # execute command
:shell         # open a new shell
:r filename    # insert the contents of a file for editing
:r ! command   # insert the output of a command for editing


评论


很好的选择。我对vi-emacs不可知,所以当确实需要powertools时,我会很高兴使用它。 (谈到vi,我前段时间尝试了N64 linux仿真器Mupen64Plus。Esc不保存就退出了仿真器。我很快放弃了玩任何游戏。)

–Lauritz V. Thaulow
2011年4月7日在20:04



@lazyr,对于debian / ubuntu,请运行sudo update-alternatives --config编辑器,然后选择您喜欢的编辑器。对于其他系统,将EDITOR或VISUAL环境变量设置为您喜欢的编辑器,例如在.bashrc中添加export EDITOR = / usr / bin / nano。

–forcefsck
2011年4月7日在20:17

#9 楼

使用zsh,如果键入<ESC> q(转义,然后键入Q),则提示行将被剪切,以便您可以键入另一个命令。您将在下一个提示下自动取回剪切的文本。

它可以同时记住多行,因此可以在一行等待时使用。您甚至可以在空白行上使用它来延迟恢复剪切线。

如果必须使用多个命令进行检查/准备,这不是最有效的方法(必须重新输入)每个命令前的<ESC> q)。但是我认为可以将其绑定到较短的快捷方式。


如果您只想查看手册,请键入<ESC> h(转义,然后按H)。这将运行内置的run-help,并以命令行的第一个单词作为参数。完成后,您会发现线路完好无损。

评论


大多数终端会让您执行M-q而不是 q

–sleblanc
18-09-26在1:51

#10 楼

与在行首添加#的方法类似,我可以使用一种可以说更简单的方法,该方法不需要返回到行首:

只需添加一个开放引号并不要关闭它,无论是单行还是双行。

然后按Enter。

然后按CtrlC。

部分命令保存在命令历史记录(可通过向上箭头获得),但未实际执行。

#11 楼

我最近为此写了一个脚本。只需Ctrl + b即可记住/恢复命令行。

下载:

访问存储库。

演示: