我想为我的团队编写一个脚本,该脚本将根据他们使用的 (JetBrains) IDE 设置一些值(我需要 IDE 应用程序的路径)。 一种方法是对所有不同的 IDE 及其潜在路径进行硬编码,但我想知道是否可以动态检索它。如果它们都从 IDE 集成终端启动脚本,我是否可以在终端中运行任何命令来检索触发终端实例的应用程序?
为了让事情变得更容易,我们都使用 macOS。
TERMINAL_PPID=$(ps -eo pid,ppid | sed -nE "s/${PPID}[[:space:]]+(\d*)/\1/p")
ps -eo pid,command | sed -nE "s/${TERMINAL_PPID}[[:space:]]+(.*\.app).*/\1/p"
$PPID
给出父进程的PID(进程ID)。
然后我们必须将该 PID 映射到应用程序路径中。
ps -eo pid,command
将给出所有进程的列表,及其 PID 和相应的命令路径,以一个或多个空格分隔。
从集成终端运行
ps -eo pid,command | grep $PPID
将给出两个结果。一个是 IDE 命令路径,另一个是我们正在运行的当前 grep
命令。
然后我们需要提取命令路径。由于
grep
不支持捕获组,因此我们可以使用 sed
来实现:
ps -eo pid,command | sed -nE "s/${PPID}[[:space:]]+(.*)/\1/p"
这将与当前命令不匹配(因为它在 pid 之后没有空格),并将返回 IDE 的完整命令路径,类似于
/Applications/CLion.app/Contents/MacOS/clion
。
就我而言,我需要
.app
文件夹的路径,所以我需要删除之后的所有内容:
ps -eo pid,command | sed -nE "s/${PPID}[[:space:]]+(.*\.app).*/\1/p"
好的,如果我在 IDE 的集成终端中运行上面的命令,这将为我提供 IDE 的路径:
/Applications/CLion.app
。
现在还有最后一件事要解决,那就是如果我编写一个从集成终端启动的脚本,
$PPID
将给出终端的进程ID。
我可以要求我的团队将 $PPID
作为脚本的参数传递。更好的是,我可以再次使用 ps
和 sed
检索 PPID 的 PPID:
ps -eo pid,ppid | sed -nE "s/${PPID}[[:space:]]+(\d*)/\1/p
ps -eo pid,ppid
将列出 PID 及其对应的 PPID
。这样我就可以查找带有终端 pid 的行(脚本中的$PPID
)并获取其 PPID,这是 IDE 的 PPID。