C++コードから次のbashスクリプトを実行します。私は、私もbash -c
をしようとしただけでなく、生産エラーよう複数行bashスクリプトをC++コードから文字列として実行する
sh: 6: [[: not found
sh: 8: [[: not found
sh: 9: [[: not found
、として、コマンドを実行し、その出力をキャプチャするsystem()
またはpopen
を使用しようとしますが、彼らが、内蔵されたSHはそれを実行しようとするので、私はエラーを取得しますなぜなら、複数行の文字列は扱えないと思うからです。
いくつかの理由から、以下のスクリプトを.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++ escapped文字列にテキストを変換するために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;
}
スクリプトを実際の*ファイル*に入れて実行してみませんか? –
なぜ '(..)'を使ってサブ・シェルで文を実行しますか? – Inian
このスクリプトはライブラリで実行されるため、余分な.shファイルをライブラリに同梱する必要はありません。また、ライブラリをUnrealエンジンビルドシステムで使用すると、作業が複雑になります。 – ShitalShah