尽管大量tmux
使用和在窗格之间切换,我仍然经常使用 shell 作业控制。当有东西需要戳时,我会将我正在使用的工具背景化Ctrl+ Z,戳东西,然后fg
再次使用该工具。问题是有时“戳”会变成使用另一种工具,我想来回几次。
是否可以绑定另一个被 shell 捕获的键(即从未传递到前台应用程序),该键将当前作业置于后台并前台运行,无论最近的后台作业是什么?
答案1
这使得只要您有超过 1 个作业暂停,发布CTRL+就会立即恢复之前的作业。Z退出 while 循环的唯一方法是关闭程序,直到最多留下 1 个后台程序。
function fgstack() {
local n_jobs=$(jobs | tr -cd "[:digit:][:space:]" | wc -l)
while [[ n_jobs -gt 1 ]]; do
fg %-;
n_jobs=$(jobs | tr -cd "[:digit:][:space:]" | wc -l)
done
}
如果你想给自己一个机会摆脱两个作业循环,那么在 0.2 秒过去之前暂停一个作业可以吗CTRL+ Z+ Z: (zsh - 对于 bash,你需要使用其他东西来获取时间) :
function fgstack() {
local n_jobs=$(jobs | tr -cd "[:digit:][:space:]" | wc -l)
while [[ n_jobs -gt 1 ]]; do
if [[ $SECONDS -lt 0.2 ]]; then
break
fi
typeset -F SECONDS=0
fg %-;
n_jobs=$(jobs | tr -cd "[:digit:][:space:]" | wc -l)
done
}
这是另一个,需要弗兹夫但如果您有两个以上的选项可供选择,则会为您提供一个菜单:
function fgstack() {
local n_jobs=$(jobs | tr -cd "[:digit:][:space:]" | wc -l)
while [[ n_jobs -gt 1 ]]; do
if [[ n_jobs -eq 2 ]]; then
fg %-;
else
job=$(jobs | fzf -0 -1 | tr -cd "[:digit:]") && fg %$job
fi
n_jobs=$(jobs | tr -cd "[:digit:][:space:]" | wc -l)
done
在 zsh 和 bash 中测试 - bash 似乎在调用函数后从第一个后台作业返回后退出 while 循环,如果有人知道如何解决这个问题,欢迎编辑和评论!