我遵循以下模式:挂起任务,然后让它过于频繁地继续执行Ctrl-Z bg序列。
我想知道有什么方法可以压缩到单个按键吗?
我的壳是 zsh
我遵循以下模式:挂起任务,然后让它过于频繁地继续执行Ctrl-Z bg序列。
我想知道有什么方法可以压缩到单个按键吗?
我的壳是 zsh
Answers:
的Ctrl+ Z序列由终端处理,而不是由外壳。(有用的背景:“终端”,“外壳”,“ tty”和“控制台”之间的确切区别是什么?)
终端中的键只能绑定一小部分不可扩展的功能。您可以自定义绑定到这些功能的键,但不能添加其他功能。这些功能分为三类:
eof
,Ctrl+ D),行尾(eol
,Ctrl+ M),左移字符(erase
,Ctrl+ H),左移字符(werase
,Ctrl+ W),线(kill
,Ctrl+ U)。stop
(Ctrl+ S),start
(Ctrl+ Q)。仅在旧的串行终端上有用,当终端无法跟上计算机的速度时,该终端会丢失字符,反之亦然。intr
,Ctrl+ C),强制退出(quit
,Ctrl+ \),暂停(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
像上面的zsh一样,^ b ^ z可以在bash中使用,尽管有点笨拙,而且我已经运行了很长时间了:
"\C-z": "bg\n"
因此,在运行命令时会打开用于暂停的^ z,然后在bash提示符下将其关闭。
因此找到了解决方案,不完全是我想要的,而是从这里https://superuser.com/a/161922/35223
在空的命令行上运行bg(以便Ctrl + Z Ctrl + Z挂起程序并立即在后台恢复它)。
Ctrl+Z
调用的基本版本bg
,我不确定要检测非空输入行)。
您是否想先在前台运行这些命令,然后再切换到后台?我不知道是否有更简单的方法可以做到这一点。但是,如果您想运行将在后台开始的命令,则只需在行末添加“&”号即可。例如,ping google.com &
将在后台开始ping;除非您输入,否则您将无法与之互动fg
。