Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C+;以字符串形式运行多行bash脚本+;代码 < >我想从C++代码中运行下面的BASH脚本。我尝试使用system()或popen运行命令并捕获其输出,但它们会出错,因为内置sh试图执行它,例如 sh: 6: [[: not found sh: 8: [[: not found sh: 9: [[: not found_C++_Linux_Bash - Fatal编程技术网

从C+;以字符串形式运行多行bash脚本+;代码 < >我想从C++代码中运行下面的BASH脚本。我尝试使用system()或popen运行命令并捕获其输出,但它们会出错,因为内置sh试图执行它,例如 sh: 6: [[: not found sh: 8: [[: not found sh: 9: [[: not found

从C+;以字符串形式运行多行bash脚本+;代码 < >我想从C++代码中运行下面的BASH脚本。我尝试使用system()或popen运行命令并捕获其输出,但它们会出错,因为内置sh试图执行它,例如 sh: 6: [[: not found sh: 8: [[: not found sh: 9: [[: not found,c++,linux,bash,C++,Linux,Bash,我也尝试了bash-c,但也产生了错误,因为我认为它不能处理多行字符串 由于几个原因,我无法将下面的脚本放入.sh文件并运行它。因此,这个脚本需要以C++的形式存储为字符串并执行。你知道怎么做吗 #!/bin/bash for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do ( syspath="${sysdevpath%/dev}" devname="$(udevadm inf

我也尝试了
bash-c
,但也产生了错误,因为我认为它不能处理多行字符串

由于几个原因,我无法将下面的脚本放入.sh文件并运行它。因此,这个脚本需要以C++的形式存储为字符串并执行。你知道怎么做吗

#!/bin/bash
for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
    (
        syspath="${sysdevpath%/dev}"
        devname="$(udevadm info -q name -p $syspath)"
        [[ "$devname" == "bus/"* ]] && continue
        eval "$(udevadm info -q property --export -p $syspath)"
        [[ -z "$ID_SERIAL" ]] && continue
        [[ "${ID_SERIAL}" == *"PX4"* ]] && echo "/dev/$devname"
    )
done
示例代码:

注意:您可以使用文本转换为C++的字符串。

int main() {
    std::cout << system("#!/bin/bash\nfor sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do\n    (\n        syspath=\"${sysdevpath%/dev}\"\n        devname=\"$(udevadm info -q name -p $syspath)\"\n        [[ \"$devname\" == \"bus/\"* ]] && continue\n        eval \"$(udevadm info -q property --export -p $syspath)\"\n        [[ -z \"$ID_SERIAL\" ]] && continue\n        [[ \"${ID_SERIAL}\" == *\"PX4\"* ]] && echo \"/dev/$devname\"\n    )\ndone");

    return 0;
}
intmain(){
std::cout您可以将多行脚本转换为单行脚本。假设您有以下脚本:

可以使用分号将上述代码转换为单行:

FOO=`uname`; if [ "$FOO" == "Linux" ]; then echo "You are using 'Linux'"; fi
现在,通过正确的转义,您可以使用
system
命令从程序中执行它,如下所示:

#include <cstdlib>
#include <string>

int main() {
    std::string foo {
        "bash -c '"
        "FOO=`uname`; "
        "if [ \"$FOO\" == \"Linux\" ]; then "
        "echo \"You are using 'Linux'.\"; "
        "fi'"
    };
    system(foo.c_str());
}
#包括
#包括
int main(){
字符串foo{
“bash-c”
“FOO=`uname`;”
“如果[\“$FOO\”==“Linux\”];则”
“echo\”您正在使用“Linux”。\”;“
“fi”
};
系统(foo.c_str());
}

请注意,相邻的字符串文字由编译器连接,因此您仍然可以使其看起来像多行脚本,以提高可读性。

为什么不将脚本放入实际文件中,然后执行?为什么在子shell中使用
(..)运行语句
?脚本将由库运行,我不希望库附带额外的.sh文件。此外,库将用于虚幻引擎构建系统,这会使事情变得更加复杂。我尝试过类似的方法,但以前没有使用过。在您的答案中,关键是对完整命令使用单引号,以避免进一步的问题ith escapping转义字符串:)。另外一个小而精细的细节不需要添加;之后。
#include <cstdlib>
#include <string>

int main() {
    std::string foo {
        "bash -c '"
        "FOO=`uname`; "
        "if [ \"$FOO\" == \"Linux\" ]; then "
        "echo \"You are using 'Linux'.\"; "
        "fi'"
    };
    system(foo.c_str());
}