我有一个电子/节点应用程序(编辑器),它使用一堆系统命令与我计算机上的一堆项目进行交互。简而言之,当我的应用程序需要有关这些项目的一些信息时(对于那些被关注的人,rospack
和rosrun
),它会执行系统命令(node
' s {{ 1}}和child_process
/ exec
)。然后格式化返回代码和标准输出,并在编辑器中显示。到目前为止一切都很好。
对于要使用的这些命令,需要获取某个bash文件。我完全不理解为什么,但我认为主要是因为它在路径中添加了一些内容,并设置了命令使用的其他两个环境变量。我不完全确定;那里可能存在一些bash /终端特定的黑魔法(当我没有获取bash并用绝对路径执行命令时,它会抱怨execSync
不存在)但是它“#”;我很难找到(对于那些感兴趣的人来说,它是来自ROS的.so
脚本)。
采购bash文件通常没问题;我的大多数朋友和我在setup.bash
中都有它。因此,当我们从命令行启动编辑器时,它会找到命令并且编辑器可以顺利运行。但是,如果您通过双击启动应用程序,则我的.bashrc
未被采购(据我所知,从眼球中看到互联网)。因此,双击时无法找到命令。
从命令行启动编辑器是可以接受的,但我希望它尽可能顺利。所以我的问题是:有没有办法在我的双击应用程序启动之前获取此bash文件?我尝试过的事情:
.bashrc
Exec="bash -c 'source the_bash.sh; ./editor'"
Exec=source_bash_and_start_editor.sh
,但这当然没有效果Exec=./editor
的bash脚本,然后双击执行编辑器。
.bashrc
,然后执行编辑器。此脚本由.bashrc
C命令在一个小型可执行文件中执行,我可以随编辑器一起提供。
system()
文件。因此,采购似乎不正确/不完整。.so
node
/ exec
次来电(即execSync
或source ~/.bashrc; rospack ...
)中获取bash文件
. ~/.bashrc; rospack ...
简单地说"命令未找到"或者沿着那些方向的东西对于上下文,我使用的是Ubuntu 16.04,而使用的电子版本是v1.4.13。
答案 0 :(得分:0)
因此,幸运的是,我正在寻找的答案出现在堆栈溢出边栏中。这里解释了这个问题: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"
调用,请参阅上面提到的堆栈溢出问题以获得解释。
我将此可执行文件放在与编辑器相同的文件夹中,当我想启动编辑器时,我可以双击此可执行文件,然后在source
'd {{.bashrc
的上下文中启动我的编辑器1}}。问题解决了!我以与机器无关的方式获取环境变量,用户现在只需双击可执行文件即可启动编辑器!