Linux后台脚本获取用户当前目录时pwd失效,有什么替代方案?
后台运行的Bash脚本如何获取交互shell的当前工作目录
问题本质
每个Linux进程都有独立的工作目录属性,后台脚本作为独立进程启动后,其工作目录和用户交互使用的shell进程工作目录完全隔离,用户在交互shell中执行cd操作不会修改后台脚本进程的工作目录,因此直接在脚本中执行pwd命令永远只能拿到脚本启动时的目录,属于系统正常机制。
同时环境变量同样存在进程隔离特性,交互shell中的PS1变量、自定义全局变量都不会自动同步到已启动的后台脚本进程中,因此之前尝试从PS1提取目录、修改全局变量的方案无法生效。
另外现有代码的while判断存在语法问题,等于号两边需要加空格,变量要加双引号避免空值报错,后续示例中已修正该问题。
可行解决方案
方案1:通过proc文件系统读取对应shell进程的工作目录(推荐,侵入性最小)
Linux的/proc文件系统中会存储每个运行中进程的运行时信息,其中/proc/[PID]/cwd是指向对应进程当前工作目录的软链接,只需要提前拿到玩游戏所用的交互shell的PID即可。
- 启动游戏脚本前,在交互shell中执行以下命令导出当前shell的PID:
export GAME_SHELL_PID=$$
- 修改脚本中获取目录的逻辑:
#!/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钩子,每次命令执行完自动将当前目录写入固定临时文件,后台脚本直接读取该文件即可。
- 在shell配置文件(bash为/.bashrc,zsh为/.zshrc)中添加以下配置,重载配置或重启终端生效:
PROMPT_COMMAND='pwd > /tmp/game_current_dir'
- 修改脚本中获取目录的逻辑:
#!/bin/bash while [ "$running" = "true" ] do # 读取临时文件中存储的当前目录,提取最后一级名称 location=$(basename $(cat /tmp/game_current_dir)) echo $location sleep 7 done
注意该方案需要确保临时文件的读写权限正常,避免被其他用户篡改。
内容的提问来源于stack exchange,提问作者Neon
相关产品推荐
相关产品推荐

