c - 在获取 bashrc 时启动应用程序

标签 c bash ubuntu electron

我有一个 Electron/节点应用程序(编辑器),它使用一堆系统命令与我计算机上的一堆项目进行交互。简而言之,当我的应用程序需要有关这些项目的一些信息(对于感兴趣的人,rospackrosrun)时,它会执行系统命令(使用 node code> 的 child_processexec/execSync)。然后,返回代码和标准输出将被格式化并显示在编辑器中。到目前为止一切顺利。

要使用这些命令,需要获取某个 bash 文件。我完全不明白为什么,但我认为主要是因为它向路径添加了一些内容,并且设置了命令使用的其他两个环境变量。但我并不完全确定;那里可能有一些 bash/终端特定的黑魔法(当我不获取 bash 并使用绝对路径执行命令时,它会提示 .so 不存在),但它非常我很难找到(对于那些感兴趣的人来说,这是来自 ROS 的 setup.bash 脚本)。

获取 bash 文件通常没有问题;我和我的大多数 friend 都将其保存在 .bashrc 中,因此当我们从命令行启动编辑器时,它会找到命令并且编辑器可以顺利运行。但是,如果您通过双击启动应用程序,则我的 .bashrc 不会被获取(据我通过浏览互联网得知)。因此,双击启动时无法找到命令。

从命令行启动编辑器是可以接受的,但我希望它尽可能顺利。所以我的问题是:有没有办法在我双击的应用程序启动之前获取这个 bash 文件?我尝试过的事情:

  • 各种形式的 Ubuntu 桌面文件:
    • Exec="bash -c 'source the_bash.sh; ./editor'"
    • Exec=source_bash_and_start_editor.sh
    • 显然也是Exec=./editor,但这肯定不起作用
    • 我也遇到了桌面文件中相对路径的问题。对于绝对路径,它似乎可以工作(使用上面的第二种和第三种方法),但这不是一个可接受的解决方案,因为我无法对路径进行硬编码。
  • 制作 bash 脚本来获取我的 .bashrc 源,然后双击执行编辑器。
    • 这可能会起作用(虽然不完全确定),但随后我必须更改一些系统设置以使 bash 脚本可双击。默认情况下,双击会在文本编辑器中打开脚本,我想避免这种情况,因为每个人都习惯了。
  • 一个 bash 脚本,它获取我的 .bashrc 然后执行编辑器。该脚本由 system() C 命令在一个小型可执行文件中执行,我可以随编辑器一起提供该可执行文件。
    • 我认为在这种情况下它实际上可以执行该命令,但是该命令找不到 .so 文件。所以看来采购发生了错误/不完整。
  • 在我的 node exec/execSync 调用中获取 bash 文件(即 source ~/.bashrc; rospack ... .~/.bashrc; rospack ...)
    • node 只是说“找不到命令”或类似的内容

就上下文而言,我使用的是 Ubuntu 16.04,我使用的 Electron 版本是 v1.4.13。

最佳答案

因此,纯属幸运,我正在寻找的答案出现在堆栈溢出侧边栏中。该问题的解释如下:source .bashrc in a script not working ,我将解释我是如何在我的案例中解决这个问题的。

所以问题是,每次我在 Node 或 C 程序中调用 source 时,source 总是在非交互式 shell 的上下文中执行。为了使其工作,您需要确保当 source 命令发生时,上下文是一个交互式 shell,或者至少看起来像一个。

我所做的是编译以下应用程序:

#include <stdlib.h>

int main() {
    putenv("PS1=BobeTerm");
    system("bash -i -c \"source ~/.bashrc && ./editor\"");

    return 0;
}

这里的神奇之处在于 bash -i -c "command" 调用,请参阅上面提到的堆栈溢出问题以获取解释。

我将此可执行文件放在与编辑器相同的文件夹中,当我想启动编辑器时,我只需双击此可执行文件,这就会在的上下文中启动我的编辑器' d .bashrc。问题解决了!我以独立于机器的方式获取环境变量,用户现在只需双击可执行文件即可启动编辑器!

关于c - 在获取 bashrc 时启动应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43692986/

相关文章:

linux - 在将文件写入文件时在 bash 终端中观察文件输出

linux - 使用 awk 更改文件的特定行

java - sonar用于定期分析java maven项目

java - Linux 服务器上的 Tomcat7 未连接到 MySQL 数据库

macos - 如何使用 Mac 终端 SSH 到本地 Ubuntu 服务器?

c - 转义序列在 scanf() 函数中的实际行为

c# - 比较并识别特定位置的位置和值并打印

linux - 如何使用shell实时连续处理tail -f换行?

java - 使用java解密OpenSSL加密数据

c - 内联-c : "` Type` cannot be marshalled in a foreign call"