如何获取启动终端实例的应用程序?

问题描述 投票:0回答:1

我想为我的团队编写一个脚本,该脚本将根据他们使用的 (JetBrains) IDE 设置一些值(我需要 IDE 应用程序的路径)。 一种方法是对所有不同的 IDE 及其潜在路径进行硬编码,但我想知道是否可以动态检索它。如果它们都从 IDE 集成终端启动脚本,我是否可以在终端中运行任何命令来检索触发终端实例的应用程序?

为了让事情变得更容易,我们都使用 macOS。

macos terminal
1个回答
0
投票

脚本

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。

© www.soinside.com 2019 - 2024. All rights reserved.