【问题标题】:How to get the absolute path of a script using its PPID - Bash如何使用其 PPID 获取脚本的绝对路径 - Bash
【发布时间】:2022-10-17 20:45:23
【问题描述】:

我正在尝试来自 shell 脚本的给定 PPID 的绝对路径。 但是,父进程可以是任何类型的脚本(bash/csh/zsh/tsh/Makefile)。

子进程始终是一个 bash 脚本,并且是我可以编辑的唯一脚本。

我努力了:

  1. ps --no-headers -o command $PPID 但它只获取调用父进程的命令。这不是我需要的,因为父级可能在脚本中造成了一些 cd,我将无法解析命令中的相对路径。

  2. ls -l /proc/$PPID/fd/255 这是最接近我想要的,但这是特定于 bash 脚本的,正如我所提到的,我无权知道我的父进程的脚本类型。

  3. /proc/$PPID/exe 返回二进制 exe,我需要使用此二进制文件的脚本的绝对路径。

【问题讨论】:

  • 无法以适用于所有解释语言的方式找到此信息。对于某些语言,这可能是完全不可能的。例如,我不确定 Makefile 的“绝对路径”是什么意思。您的意思是对于给定的 make 运行实例,您想从其他进程中找到它正在运行的 makefile 的名称。那是完全不可能的。我不知道 bash 技巧,但我不会依赖它总是如此,其他人也是如此。
  • 您最好的选择可能是/proc/$PPID/cmdline,但请注意,程序可以选择将其设置为任何他们想要的。
  • 试试这个ps -eo pid,cmd | grep $pid
  • @Ivan,ps 在足够现代的 Linux 上通过读取 procfs 来工作,因此它是一个比 procfs 本身更不直接的工具。

标签: bash shell makefile ps


【解决方案1】:
  • 没有“绝对”路径之类的东西。可能有几种方法可以访问同一个文件。有时,它们中的任何一个(或不止一个,取决于您如何看待它)都不是“主要”名称。 例如,我在这里考虑硬链接。

  • Makefile 永远不是脚本的路径。它只是一个配置文件。可执行文件默认读取它。这可能是/usr/bin/make。要找到Makefile 文件的路径,您需要读取make 的参数。或者在打开的文件中找到一个Makefile(假设只有一个,并且它被命名为Makefile,这是不确定的)。而猜测make 进程的Makefile 是什么的策略特定于make。您需要另一种策略来猜测bash 进程执行的脚本文件是什么,另一种策略是找到由python 命令执行的python 文件(可能是shebang python“可执行文件”,python ../somerealtive/path/somefile.py@987654330) @一个python -m somemodele,一个python -c "import somemod ; somemod.run()"等)

  • 现在,既然你提到了/proc/$PPID/exe,你可以通过这个来“指向”文件,使用 path=$(readlink -f /proc/$PPID/exe)

同样,这是 linux 解决方案,而不是 bash 解决方案。 bash 无法保证运行此命令的系统具有 /proc 文件系统

我必须补充一点,我怀疑这里有 XY 问题。你到底想做什么?

【讨论】:

  • 我有不同类型的脚本(黑盒),最后都会调用一组对我来说是可编辑的 shell 脚本。我的目标是,当任何叶子 shell 脚本被调用时,我可以获得调用它的调用者脚本的完整路径(父脚本)..所有这些都通过这些叶子 sh 脚本处理。 @chrslg
  • @MariamFayed,一些shell 有一个众所周知的文件描述符,它们在其上打开正在运行的源代码,但这并不是在 shell 或系统中可靠的东西。
猜你喜欢
  • 2022-06-10
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 2017-05-04
  • 2013-06-26
相关资源
最近更新 更多