Python 3.8 (pre-release), 245 237237 247 bytes
-8 bytes thanks to Jo King
+10 bytes because input wasn't handled correctly
from sys import*
i,n,*a=[0]*30002
exec('\n'.join([((i:=i+(v:=s=='[')-(s==']'))-v)*' '+'while(a[n]): 0 n-=1 n+=1 a[n]+=1 a[n]-=1 a[n]=ord(stdin.read(1)) print(end=chr(a[n]))'.split()[u.index(s)]for s in open(argv[1]).read()if s in(u:='[]<>+-,.')]))
Compiles bf
source code to python
and execs.