从后台恢复工作时切换回路径

sen*_*hil 2 bash zsh directory cd-command background-process

假设我打开~/vim.txt,将其推到后台,然后推cd到另一条路径。当我将该工作置于前台时,是否可以选择切换回旧路径?我注意到它说pwd,所以我认为这是可能的。

Gil*_*il' 5

这在 zsh 中是可能的,实际上这很容易,这要归功于zsh/parameter 模块提供的对作业参数的直接访问。你可以使用一个作业号或任何作业规范(%+%-%foo等)作为在阵列中的下标。

zmodload zsh/parameter
fgcd () {
  local dir=$jobdirs[${1:-%+}]
  # If the jobspec matched, then call cd. Otherwise it's probably a bad
  # job spec, but call fg anyway to get the usual error message.
  if [[ -n $dir ]]; then cd $dir; fi
  fg $1
}
Run Code Online (Sandbox Code Playgroud)

Bash 还跟踪信息,但我认为它没有暴露。在某些系统上,您可以获得作业进程的当前工作目录,并切换到该目录。例如,在 Linux 上,/proc/$pid/cwd是指向该进程工作目录的符号链接。

fgcd () { # Linux only
  local pid=$(jobs -p $1)
  if [[ -n $pid ]]; then cd /proc/$pid/cwd; fi
  fg $1
}
Run Code Online (Sandbox Code Playgroud)

由于它也很有用,这里有一个 zsh 版本。与上面的功能切换到作业的原始目录不同,这个功能切换到作业的进程领导者的当前工作目录。

fgcd () { # Linux only
  local pid=${${${jobstates[${1:-%+}]}#*:*:}%\=*}
  if [[ -n $pid ]]; then cd /proc/$pid/cwd; fi
  fg $1
}
Run Code Online (Sandbox Code Playgroud)