如何将命令行应用程序直接发送到后台?

tru*_*ktr 25 command-line shell jobs background-process

我已经知道按下会ctrl+z停止应用程序,然后我可以使用bg命令将应用程序发送到后台,但这意味着应用程序停止的时间很短。

如何在不停止的情况下将应用程序直接发送到后台?

pra*_*k61 18

您可以通过在任务&后面添加一个来作为后台任务。

例如tail -f /var/log/messages &将立即后台任务。

与往常一样,您可以看到您使用该jobs命令后台处理的任务。

这当然假设您尚未运行该命令。


Gil*_*il' 18

将应用程序从前台发送到后台需要终端和外壳的合作。终端不能单独做,因为shell要设置前台进程组。外壳无法单独完成,因为终端必须处理按键操作(外壳不在前台,因此无法接收按键)。

一个近似的方法是非常快速地将应用程序发送到后台。毕竟,应用程序与其他应用程序共享 CPU 时间,百分之几秒的暂停应该无关紧要。(它适用于实时应用程序,因此请确保在后台启动这些应用程序。)我使用 shell 绑定Ctrl+Z将最后一个前台作业发送到后台。这样,按Ctrl+ Z Ctrl+Z会将作业以最少的暂停时间发送到后台。

这是我的 zsh 绑定,当命令行不为空时,它也“背景”了一个半类型的命令

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)

在英语中,对于观众中的非 zsh 用户:

  • 定义执行以下操作的 shell 函数:

  • 将此函数绑定到Ctrl+ Z

如果您只想要后台行为而不管命令行是否为空:

function bg_ { builtin bg "$@"; }
zle -N bg_
bindkey '^Z' bg_
Run Code Online (Sandbox Code Playgroud)

我不知道你是否可以在 bash 中做同样的事情。它应该和 一样简单bind -x '"\C-z": bg',只是 bash 将 tty 停止字符留在原地,因此它永远不会将Ctrl+Z作为输入。