You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux后台脚本获取用户当前目录时pwd失效,有什么替代方案?

后台运行的Bash脚本如何获取交互shell的当前工作目录

问题本质

每个Linux进程都有独立的工作目录属性,后台脚本作为独立进程启动后,其工作目录和用户交互使用的shell进程工作目录完全隔离,用户在交互shell中执行cd操作不会修改后台脚本进程的工作目录,因此直接在脚本中执行pwd命令永远只能拿到脚本启动时的目录,属于系统正常机制。
同时环境变量同样存在进程隔离特性,交互shell中的PS1变量、自定义全局变量都不会自动同步到已启动的后台脚本进程中,因此之前尝试从PS1提取目录、修改全局变量的方案无法生效。
另外现有代码的while判断存在语法问题,等于号两边需要加空格,变量要加双引号避免空值报错,后续示例中已修正该问题。

可行解决方案

方案1:通过proc文件系统读取对应shell进程的工作目录(推荐,侵入性最小)

Linux的/proc文件系统中会存储每个运行中进程的运行时信息,其中/proc/[PID]/cwd是指向对应进程当前工作目录的软链接,只需要提前拿到玩游戏所用的交互shell的PID即可。

  1. 启动游戏脚本前,在交互shell中执行以下命令导出当前shell的PID:
export GAME_SHELL_PID=$$
  1. 修改脚本中获取目录的逻辑:
#!/bin/bash
while [ "$running" = "true" ]
do
# 读取对应shell进程的当前工作目录,提取最后一级名称
location=$(basename $(readlink /proc/$GAME_SHELL_PID/cwd))
echo $location
sleep 7
done

方案2:通过PROMPT_COMMAND钩子同步目录到临时文件

如果需要适配多shell窗口的场景,可以利用shell的PROMPT_COMMAND钩子,每次命令执行完自动将当前目录写入固定临时文件,后台脚本直接读取该文件即可。

  1. 在shell配置文件(bash为/.bashrc,zsh为/.zshrc)中添加以下配置,重载配置或重启终端生效:
PROMPT_COMMAND='pwd > /tmp/game_current_dir'
  1. 修改脚本中获取目录的逻辑:
#!/bin/bash
while [ "$running" = "true" ]
do
# 读取临时文件中存储的当前目录,提取最后一级名称
location=$(basename $(cat /tmp/game_current_dir))
echo $location
sleep 7
done

注意该方案需要确保临时文件的读写权限正常,避免被其他用户篡改。

内容的提问来源于stack exchange,提问作者Neon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 02:15:06