0

我的脚本从作为参数提供的文本文件中读取“.bag”文件列表。并与每个人一起做某事。(为清楚起见,我省略了大部分“东西”)

while IFS= read -r bag
do

    echo Extracting from $bag

    # Play the script for saving the images
    python2 extract_imgs.py --image_topics "$image_topics" --basepath "extracted_imgs/$bag_name" &
    extract_imgs_PID=$!

    # play the bag file
    rosbag play -r 10 $bag

    echo rosbag play returned: $?
    echo finished playing $bag

    # kill the subscribe node
    kill $extract_imgs_PID

done < $1

如果我注释掉该rosbag play -r 10 $bag行,该脚本的行为与我预期的一样:它从 $1 读取每一行并运行循环的迭代,并将该行设置为 $bag。

但是使用 'rosbag play -r 10 $bag' 行,它在第一行正常工作,但随后退出循环并完成。为什么?的返回状态rosbag play0。我怎样才能让这个脚本运行 rosbag play 命令,然后继续循环输入文件的行?

4

2 回答 2

0

问题与以下相同:

我正在逐行读取文件并运行 ssh 或 ffmpeg,只有第一行得到处理!

所以解决方案是重定向标准输入:

rosbag play -r 10 $bag </dev/null
于 2020-05-18T14:24:38.700 回答
-1

我将提供一个解决方案,并声明我提供的解决方案通常不会在这里得到很好的接受;但不管怎么说...

#!/bin/sh -x

init() {
cat >> edprint+.txt << EOF
1p
q
EOF

cat >> edpop+.txt << EOF
1d
wq
EOF

next
}

next() {
[[ -s stack ]] && main
end
}

main() {
filename=$(ed -s stack < edprint+.txt)
python2 extract_imgs.py --image_topics "$image_topics" --basepath "extracted_imgs/$bag_name" &
    extract_imgs_PID=$!
rosbag play -r 10 ${filename}
echo "rosbag play returned: $?"
echo "finished playing ${filename}"
ed -s stack < edpop+.txt
next
}

end() {
rm -v ./edpop+.txt
rm -v ./edprint+.txt
exit 0
}

init

上面的脚本使用包含名称的文本文件作为堆栈。Ed 用于将每个文件名放入一个变量中,然后您可以根据该变量运行您想要的任何命令。在 main 函数结束时,再次调用 Ed 以从文件中删除第一行;两个函数(main 和 next)之间的循环迭代直到文本文件为空,此时两个 Ed 命令文件被删除,脚本终止。

于 2020-05-18T14:53:38.097 回答