2016-05-23 147 views
0

我正在C++中创建一个应用程序,该应用程序可以执行一些命令shell来获取有关系统的信息。当我在我的脚本代码中使用类似[[ "$devname" == "bus/"* ]]&& continue;的命令时,执行此命令会返回错误,这可能是因为在执行脚本脚本时,环境位于dash而不是bash。我试图用#!/usr/bin/env bash执行该命令,但不起作用。完整的命令是内联硬编码的,我避免使用shell脚本文件。在C++中执行shell命令时强制执行环境bash

回答

1

如果您有这样的命令,说:

[[ "$devname" == "bus/"* ]] && hostname || echo "no" 

您可以运行这样说:

bash -c '[[ "$devname" == "bus/"* ]] && hostname || echo "no"' 

所以,如果你只是建立一个包含上述一个字符串,可以使用popen()或任何运行它。在C++中,你将不得不如果你使用上面的字面逃跑内报价,因此:

const char* command = "bash -c '[[ \"$devname\" == \"bus/\"* ]] && hostname || echo \"no\"'"; 
+0

我使用这个解决方案,因为在我的解决方案中,我使用了popen,但只使用了十六进制格式的命令以避免使用de scape字符 – JulianOliveira

2

你有两个选择:

1)明确通过putenv()设置SHELL

putenv("SHELL=/bin/bash"); 
execl(...); 

2)明确执行/bin/bash,而不是依靠hashbang:

execl("/bin/bash", script.c_str(), NULL); 

// script is the script you're trying to execute. 
+0

我不认为您的解决方案(1)应该工作。谁应该尊重'SHELL'变量? C++不一定会这样做(标准中没有任何内容会强加它),对于程序加载器也不是特别的。如果要加载的脚本没有sheebang行,则会使用默认shell(通常是'sh')。 – user1934428