我想从C++代码中运行以下bash脚本。我试着使用 system() 或 popen
system()
popen
sh: 6: [[: not found sh: 8: [[: not found sh: 9: [[: not found
我试过了 bash -c 但这也产生了错误,因为我认为它不能处理多行字符串。
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; }
可以转动多行 bash 猛击
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 命令从您的 c++
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()); }
请注意,相邻的字符串文字由编译器连接,因此您仍然可以使其看起来像多行脚本,以提高可读性。