我有一个 Electron/节点应用程序(编辑器),它使用一堆系统命令与我计算机上的一堆项目进行交互。简而言之,当我的应用程序需要有关这些项目的一些信息(对于感兴趣的人,rospack
和 rosrun
)时,它会执行系统命令(使用 node
code> 的 child_process
和 exec
/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/