当我检查某事时记住一个半键入的命令

Lau*_*low 104 command-line bash zsh

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

  • 命中ctrl+ alt+F2和登录另一个虚拟控制台上,并找出我想要的东西,然后回去继续
  • ctrl+ a,输入 echo + space+ enter,找出我想要的,按?直到我找到我的命令,ctrl+ a, delx 5, ctrl+ e,然后继续
  • 用鼠标突出显示到目前为止我输入的内容(如果 gpm 正在运行,通常是这样),按ctrl+c中断,找出我想要的内容,同时注意不要使用鼠标突出显示内容,然后按鼠标中键在新的提示下并继续
  • 向命令行大神祈祷,写一半的命令不会有任何不利影响,只会失败,然后小心翼翼地按回车,然后找出我想要的东西,按向上箭头直到我得到我的命令,然后继续
  • 跳进我的时光机,回到过去并提醒自己在开始输入命令之前启动屏幕,回到现在,按ctrl+ a c,找出我想要的,按ctrl+ a ctrl+a,然后继续

所以我想知道的是,有没有更优雅的方法来做到这一点?一种子shell命令或类似的?

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

Mic*_*zek 76

alex 的 Ctrl+ A Ctrl+ 的一个稍微快一点的版本K(它移动到行的前面,然后向前剪切所有内容)是只使用Ctrl+ U,它在 bash 上向后剪切,在 zsh 上使用整行(无论您当前的位置如何)。然后你使用Ctrl+Y再次粘贴它

  • @lazyr 哦,没错;在 `zsh` 上,它确实剪切了整条线,但在 `bash` 上,它向后剪切。我以前从未注意到这种差异 (2认同)
  • 哦,我不知道 Ctrl+U 也把文本杀死缓冲区。很高兴知道!:) (2认同)

小智 53

执行 ctrl-A 以到达行首,添加一个散列并按回车键 - 这样它将作为注释保留在命令历史记录中,您可以通过向上光标返回它

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

  • @barrycarter:不,`:` 应该被认为是有害的,永远不要被建议。它将在分号、反引号内等之后执行所有内容,并带有所有相关的副作用。 (6认同)
  • 请注意,这在 `csh` 或 `zsh` 中不起作用,因为它们不允许在交互式 shell 中进行注释。在 `zsh` 中,您需要激活正确的选项:`setopt interactive_comments`。 (4认同)

ale*_*lex 29

点击Ctrl+A,Ctrl+K移动到行首并删除 (kill) 到行尾。然后做你的研究,当准备好继续点击Ctrl+Y(猛拉)把你保存的(被杀死的)线放回去。

  • 啊,现在这更像是我的想法。我一直在 Emacs 中这样做,应该考虑在命令行上做同样的事情。 (3认同)

Gil*_*il' 13

在 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
Run Code Online (Sandbox Code Playgroud)

我不知道如何在 bash 中做类似的事情。

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

  • @Caleb `push-input` 挂起整个输入缓冲区,而 `push-line` 只挂起当前行。如果我正在输入多行命令,我想暂停整个命令,所以 `push-input` 是正确的。我发现`push-input`比`push-line`更有用(如果我想延迟多行输入缓冲区中的一行,我可以简单地导航到行的开头并插入一个换行符),所以我实际上想知道为什么 `push-line` 得到了默认的键绑定而不是 `push-input`。 (3认同)
  • 你的功能令人钦佩,但你知道`zsh`有一个功能[已经内置](http://unix.stackexchange.com/questions/10825/remember-a-half-typed-command-while-我检查某事/11982#11982)?它被称为“push-line”,您需要做的就是使用“bindkey”来获取它。 (2认同)

Mik*_*kel 13

在 bash 中,只需输入Alt+ #

然后当你准备好时,按Up然后Alt+ #

第一个将 a#放在行首以将其转换为注释,然后接受该行,就好像您按下了Enter

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

如果第二次刚插入另一个#,那么你必须键入Alt+ - Alt+#代替。

你可以让 zsh 做同样的事情

bindkey -M emacs '\e#' pound-insert
Run Code Online (Sandbox Code Playgroud)

在你的 ~/.zshrc 中。

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

  • Alt+# 按照您在第三段中的描述工作,但与第四段不同,它只是在前面加上另一个 # 并接受该行。我在 Ubuntu 10.10 上使用 bash 4.1.5(1)-release。 (3认同)
  • 对我不起作用,第二个命令意味着删除 # 只是在前面添加更多#。 (2认同)

Cal*_*leb 10

我最喜欢的功能之一zsh是内置的推线功能,它可以解决这个问题,而没有其他答案中的任何技巧。我有它必然Ctrl+l在我的.zshrc文件是这样的:

bindkey '^L' push-line
Run Code Online (Sandbox Code Playgroud)

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

您甚至可以链接多个层,命令会以与您将它们推入队列相反的顺序返回给您。

  • 默认绑定到`Ctrl+Q` 和`ESC q`(在emacs 模式下)。 (6认同)

war*_*ren 5

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

你也可以用ctrl+打开另一个窗口a c

  • 如果您在屏幕中,只需使用“Ctrl+A c”打开另一个窗口。 (8认同)