如何在一个按键中执行 Ctrl-Z 和 bg 以使进程在后台继续?

Evg*_*nko 30 linux keyboard-shortcuts zsh shell

我遵循这种模式,暂停任务,然后让它在Ctrl-Z bg序列中过于频繁地继续。

我想知道有没有办法将其压缩为单个按键?

我的壳是 zsh

Gil*_*il' 27

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

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

  • 不提供自己的程序中的命令行版本(规范模式,也称为熟模式(与原始模式相反),在实践中很少使用):文件结尾 ( eof, Ctrl+ D),行结尾 ( eol, Ctrl+ M), 向左擦除字符 ( erase, Ctrl+ H), 向左擦除单词 ( werase, Ctrl+ W), 擦除行 ( kill, Ctrl+ U)。
  • 手动流量控制:stopCtrl+ S), startCtrl+ Q)。仅在旧的串行终端上有用,当终端跟不上计算机时会丢弃字符,反之亦然。
  • 信号:中断(intr, Ctrl+ C),强制退出(quit, Ctrl+ \),挂起(Ctrl+ Z)。

包括 Linux 在内的一些系统扩展了该列表,但我从未见过包含后台的系统。请注意,它将在内核中的终端驱动程序和终端仿真器中都获得支持。所以你必须处理挂起,它向前台作业发送一个SIGTSTP信号。这会在前台作业的领导者(通常是外壳程序)的父进程中触发SIGCHLD。当 shell 收到 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
Run Code Online (Sandbox Code Playgroud)


Joh*_*tle 5

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

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

因此,当命令运行时,^z 表示挂起,然后在 bash 提示符下关闭。