【发布时间】:2021-11-01 21:28:16
【问题描述】:
在终端应用程序中,我的$PATH 是:
/usr/local/opt/python/libexec/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin
如果用户使用 Dock 启动我的 C++ 应用程序,它的 $PATH 是:
/usr/bin:/bin:/usr/sbin:/sbin
我希望我的应用程序始终具有与终端 (bash) 相同的 $PATH。
有没有简单的方法来实现这一点?
我现在知道的唯一方法是在磁盘上创建一个带有 echo $PATH 之类的 bash 脚本,使用 bash -l 命令从我的 C++ 程序启动它,读取输出并更新我的进程'@ 987654328@ 相应变量。
而且,我不想以任何方式更改用户系统的配置。这应该无需用户进行任何额外操作即可工作,并且不会以任何方式影响用户的系统。
【问题讨论】:
-
这当然是一种合理的做法。来自 Bare Bones Software 的 BBEdit 正是这样做的。我提醒您不要假设用户的首选 shell 实际上是 bash,而是您阅读了他们的默认 shell 并使用它。
-
您必须让您的应用确定用户使用的外壳,然后调用它或解释它的启动文件。
-
我不得不说,你不想尝试自己解释启动文件。这就是外壳的用途。 ^_^ 只需启动一个非交互式登录 shell 并读取它的环境。我知道 BBEdit 这样做是因为 v14 没有在 Unix Worksheets 中正确设置路径,我询问了他们的技术支持他们如何确定路径,然后让他们将
ksh添加到他们的 shell 列表中。引用:“BBEdit 永远不会设置 $PATH;当它启动时,它将启动一个非交互式登录 shell 并运行printenv命令,并解释输出以找到PATH。” -
关于
bash不是默认外壳的问题...询问bashmy $PATH 或多或少没用。您不能假设用户的 shell 是bash,或者如果不是,他们已经投入任何精力来配置bash。 -
@MarcWilson 在 macOS 上,/etc/passwd 是一个不包含任何有用内容的存根。实际帐户作为 .plist 文件存储在 /var/db/dslocal/nodes/Default/users/ 中。或者可能在网络域或其他地方。
dscl是获取用户信息的好方法。
标签: c++