【问题标题】:Forcing the environment to bash when executing shell command in C++在 C++ 中执行 shell 命令时强制环境 bash
【发布时间】:2016-05-23 12:23:57
【问题描述】:

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

【问题讨论】:

    标签: c++ linux bash shell


    【解决方案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\"'";
    

    【讨论】:

    • 我使用这个解决方案是因为在我的解决方案中我使用的是 popen,但只使用了十六进制格式的命令以避免使用 de scape 字符
    【解决方案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.
    

    【讨论】:

    • 我不认为您的解决方案 (1) 应该有效。谁应该尊重SHELL 变量? C++ 不一定会这样做(标准中没有任何东西会强加它),对于程序加载器也不是特别的。如果要加载的脚本没有 sheebang 行,则将使用默认 shell(通常为 sh)。
    猜你喜欢
    • 2017-11-09
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    相关资源
    最近更新 更多