如何一键按下Ctrl-Z和bg使进程在后台继续?


24

我遵循以下模式:挂起任务,然后让它过于频繁地继续执行Ctrl-Z bg序列。

我想知道有什么方法可以压缩到单个按键吗?

我的壳是 zsh


我想说的可能是硬编码。但是我不是100%
乍得·哈里森

可以,但是我已经找到了一种优雅的解决方案,谢谢superuser.com/a/161922/35223
Evgeniy Dolzhenko 2012年

Answers:


24

Ctrl+ Z序列由终端处理,而不是由外壳。(有用的背景:“终端”,“外壳”,“ tty”和“控制台”之间的确切区别是什么?

终端中的键只能绑定一小部分不可扩展的功能。您可以自定义绑定到这些功能的键,但不能添加其他功能。这些功能分为三类:

  • 不提供自己程序的程序中的命令行版本(规范模式,也称为熟模式(与原始模式相对),在实践中很少使用):文件结尾(eofCtrl+ D),行尾(eolCtrl+ M),左移字符(eraseCtrl+ H),左移字符(weraseCtrl+ W),线(killCtrl+ U)。
  • 手动流量控制:stopCtrl+ S),startCtrl+ Q)。仅在旧的串行终端上有用,当终端无法跟上计算机的速度时,该终端会丢失字符,反之亦然。
  • 信号:中断(intrCtrl+ C),强制退出(quitCtrl+ \),暂停(Ctrl+ Z)。

包括Linux在内的某些系统扩展了该列表,但我从未见过包含后台的系统。请注意,它将同时支持内核的终端驱动程序和终端仿真器。因此,您必须处理挂起,这会向前台作业发送SIGTSTP信号。这会在前台作业的领导者(通常是外壳)的父进程中触发SIGCHLD。当外壳程序接收到SIGCHLD时,它将调用waitpid以找出被通知的原因,并在检测到后台作业被挂起后,显示通知(例如[1] + 12345 suspended mycommand)和新的提示。

您可以对Shell进行编程,以将SIGCONT信号发送到前台作业。我不认为zsh对此有什么要求,您需要修补源代码。而且zsh无法知道您是否真的要中断程序(哎呀,该程序可能做错了事,让我在解决问题时将其暂停)或使其后台运行。


我要做的是在zsh 中将Ctrl+ Z键序列设置为当前作业的后台(%%)。这样,我可以通过按Ctrl+ Z Ctrl+ 将前台作业发送到后台Z。在执行此操作时,当当前输入行不为空时,我会做Ctrl+ Z有用的事情(因此,我不仅仅是从子流程中回来):“暂停”当前输入行,允许我键入另一个命令,然后将中断的行推回输入缓冲区。

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

吉尔斯,这是我无法料想的完整,有教育意义和深思熟虑的答案!非常感谢!
Evgeniy Dolzhenko 2012年

2

像上面的zsh一样,^ b ^ z可以在bash中使用,尽管有点笨拙,而且我已经运行了很长时间了:

  • 在您的.inputrc中包括映射 "\C-z": "bg\n"
  • 在PS0 bash变量中包含`$(stty susp ^ z)'
  • 在PROMPT_COMMAND bash变量中包含“ stty susp ^ @”

因此,在运行命令时会打开用于暂停的^ z,然后在bash提示符下将其关闭。


1

因此找到了解决方案,不完全是我想要的,而是从这里https://superuser.com/a/161922/35223

在空的命令行上运行bg(以便Ctrl + Z Ctrl + Z挂起程序并立即在后台恢复它)。


我会注意到,这需要zsh; bash不支持它。(即开箱即用)
凯文M

@KevinM您可以在bash中编写一个类似的函数(至少是进行Ctrl+Z调用的基本版本bg,我不确定要检测非空输入行)。
吉尔斯2012年

0

您是否想先在前台运行这些命令,然后再切换到后台?我不知道是否有更简单的方法可以做到这一点。但是,如果您想运行将在后台开始的命令,则只需在行末添加“&”号即可。例如,ping google.com &将在后台开始ping;除非您输入,否则您将无法与之互动fg


1
谢谢,问题在于,有时您不知道运行该命令将花费多少时间,因此您可以交互式运行,然后意识到最好让它在后台继续运行。接受的答案每天为我使用,对我来说是奇迹!
Evgeniy Dolzhenko

感谢您的回复。接受的答案很简洁!
2012年
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.