繁体   English   中英

在C ++中执行shell命令时强制环境进行重击

[英]Forcing the environment to bash when executing shell command in C++

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

您有两种选择:

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.

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

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

您可以通过以下方式运行它:

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

因此,如果仅构建一个包含以上内容的字符串,则可以使用popen()或其他任何方式运行它。 在C ++中,如果直接使用上述内容,则必须转义内部引号,因此:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM