bash 执行某些命令时,脚本不会遍历文件中的行

bash script won't loop over lines in file when certain command executed

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

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 < 

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

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

问题相同:

I'm reading a file line by line and running ssh or ffmpeg, only the first line gets processed!

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

rosbag play -r 10 $bag </dev/null

我会提供一个解决方案,但我提供的解决方案通常不会在这里得到很好的接受;但无论如何...

#!/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 命令文件被删除,脚本终止。