代码之家  ›  专栏  ›  技术社区  ›  Shital Shah

从C++代码中以字符串形式运行多行bash脚本

  •  0
  • Shital Shah  · 技术社区  · 8 年前

    我想从C++代码中运行以下bash脚本。我试着使用 system() popen

    sh: 6: [[: not found
    sh: 8: [[: not found
    sh: 9: [[: not found
    

    我试过了 bash -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
    

    示例代码:

    注意:您可以使用 this tool

    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;
    }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Akira    8 年前

    可以转动多行

    FOO=`uname`
    if [ "$FOO" == "Linux" ]; then
        echo "You are using 'Linux'"
    fi
    

    上面的代码可以通过使用 分号 :

    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());
    }
    

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

    推荐文章